LyoKICogVXNlciBJbnRlcmZhY2UgRnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTk3IERpbWl0cmllIE8uIFBhdW4KICogQ29weXJpZ2h0IDE5OTcgQmVydGhvIEEuIFN0dWx0aWVucwogKi8KCiNpbmNsdWRlICJ3aW5lL3dpbnVzZXIxNi5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAidHdlYWsuaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChncmFwaGljcykKCnN0YXRpYyBjb25zdCBXT1JEIHdQYXR0ZXJuX0FBNTVbOF0gPSB7IDB4YWFhYSwgMHg1NTU1LCAweGFhYWEsIDB4NTU1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhYWFhLCAweDU1NTUsIDB4YWFhYSwgMHg1NTU1IH07CgovKiBUaGVzZSB0YWJsZXMgYXJlIHVzZWQgaW46CiAqIFVJVE9PTFNfRHJhd0RpYWdFZGdlKCkKICogVUlUT09MU19EcmF3UmVjdEVkZ2UoKQogKi8Kc3RhdGljIGNvbnN0IGNoYXIgTFRJbm5lck5vcm1hbFtdID0gewogICAgLTEsICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEsCiAgICAtMSwgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfQlROSElHSExJR0hULCAtMSwKICAgIC0xLCAgICAgICAgICAgQ09MT1JfM0RES1NIQURPVywgICBDT0xPUl8zRERLU0hBRE9XLCAgIC0xLAogICAgLTEsICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUT3V0ZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEsCiAgICBDT0xPUl9CVE5ISUdITElHSFQsIENPTE9SXzNETElHSFQsICAgICBDT0xPUl9CVE5TSEFET1csIC0xLAogICAgQ09MT1JfM0RES1NIQURPVywgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIFJCSW5uZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgLTEsCiAgICAtMSwgICAgICAgICAgIENPTE9SX0JUTlNIQURPVywgICBDT0xPUl9CVE5TSEFET1csIC0xLAogICAgLTEsICAgICAgICAgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfM0RMSUdIVCwgICAtMSwKICAgIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIFJCT3V0ZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfM0RES1NIQURPVywgIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEsCiAgICBDT0xPUl9CVE5TSEFET1csIENPTE9SXzNEREtTSEFET1csICBDT0xPUl9CVE5ISUdITElHSFQsIC0xLAogICAgQ09MT1JfM0RMSUdIVCwgICBDT0xPUl8zRERLU0hBRE9XLCAgQ09MT1JfQlROSElHSExJR0hULCAtMSwKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfM0RES1NIQURPVywgIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUSW5uZXJTb2Z0W10gPSB7CiAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMSwKICAgIC0xLCAgICAgICAgICAgICAgICAgIENPTE9SXzNETElHSFQsICAgICBDT0xPUl8zRExJR0hULCAgIC0xLAogICAgLTEsICAgICAgICAgICAgICAgICAgQ09MT1JfQlROU0hBRE9XLCAgIENPTE9SX0JUTlNIQURPVywgLTEsCiAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMQp9OwoKc3RhdGljIGNvbnN0IGNoYXIgTFRPdXRlclNvZnRbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMSwKICAgIENPTE9SXzNETElHSFQsICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMSwKICAgIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMSwKICAgIC0xLCAgICAgICAgICAgICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMQp9OwoKI2RlZmluZSBSQklubmVyU29mdCBSQklubmVyTm9ybWFsICAgLyogVGhlc2UgYXJlIHRoZSBzYW1lICovCiNkZWZpbmUgUkJPdXRlclNvZnQgUkJPdXRlck5vcm1hbAoKc3RhdGljIGNvbnN0IGNoYXIgTFRSQk91dGVyTW9ub1tdID0gewogICAgLTEsICAgICAgICAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgTFRSQklubmVyTW9ub1tdID0gewogICAgLTEsIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAtMSwKICAgIC0xLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLAogICAgLTEsIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csCiAgICAtMSwgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUUkJPdXRlckZsYXRbXSA9IHsKICAgIC0xLCAgICAgICAgICAgICAgICBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLAogICAgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csCiAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKICAgIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgTFRSQklubmVyRmxhdFtdID0gewogICAgLTEsIC0xLCAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMSwKICAgIC0xLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgLTEsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCiAgICAtMSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVUlUT09MU19EcmF3RGlhZ0VkZ2UKICoKICogU2FtZSBhcyBEcmF3RWRnZSBpbnZva2VkIHdpdGggQkZfRElBR09OQUwKICoKICogMDMtRGVjLTE5OTc6IENoYW5nZWQgYnkgQmVydGhvIFN0dWx0aWVucwogKgogKiBTZWUgYWxzbyBjb21tZW50cyB3aXRoIFVJVE9PTFNfRHJhd1JlY3RFZGdlKCkKICovCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3RGlhZ0VkZ2UoSERDIGhkYywgTFBSRUNUIHJjLCAKCQkJCSAgICAgVUlOVCB1VHlwZSwgVUlOVCB1RmxhZ3MpCnsKICAgIFBPSU5UIFBvaW50c1s0XTsKICAgIGNoYXIgSW5uZXJJLCBPdXRlckk7CiAgICBIUEVOIElubmVyUGVuLCBPdXRlclBlbjsKICAgIFBPSU5UIFNhdmVQb2ludDsKICAgIEhQRU4gU2F2ZVBlbjsKICAgIGludCBzcHgsIHNweTsKICAgIGludCBlcHgsIGVweTsKICAgIGludCBXaWR0aCA9IHJjLT5yaWdodCAtIHJjLT5sZWZ0OwogICAgaW50IEhlaWdodD0gcmMtPmJvdHRvbSAtIHJjLT50b3A7CiAgICBpbnQgU21hbGxEaWFtID0gV2lkdGggPiBIZWlnaHQgPyBIZWlnaHQgOiBXaWR0aDsKICAgIEJPT0wgcmV0dmFsID0gISggICAoKHVUeXBlICYgQkRSX0lOTkVSKSA9PSBCRFJfSU5ORVIKICAgICAgICAgICAgICAgICAgICAgICB8fCAodVR5cGUgJiBCRFJfT1VURVIpID09IEJEUl9PVVRFUikKICAgICAgICAgICAgICAgICAgICAgICYmICEodUZsYWdzICYgKEJGX0ZMQVR8QkZfTU9OTykpICk7CiAgICBpbnQgYWRkID0gKExUUkJJbm5lck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApCiAgICAgICAgICAgICsgKExUUkJPdXRlck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApOwoKICAgIC8qIEluaXQgc29tZSB2YXJzICovCiAgICBPdXRlclBlbiA9IElubmVyUGVuID0gKEhQRU4pR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pOwogICAgU2F2ZVBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIElubmVyUGVuKTsKICAgIHNweCA9IHNweSA9IGVweCA9IGVweSA9IDA7IC8qIFNhdGlzZnkgdGhlIGNvbXBpbGVyLi4uICovCiAgICAKICAgIC8qIERldGVybWluZSB0aGUgY29sb3JzIG9mIHRoZSBlZGdlcyAqLwogICAgaWYodUZsYWdzICYgQkZfTU9OTykKICAgIHsKICAgICAgICBJbm5lckkgPSBMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBPdXRlckkgPSBMVFJCT3V0ZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfRkxBVCkKICAgIHsKICAgICAgICBJbm5lckkgPSBMVFJCSW5uZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBPdXRlckkgPSBMVFJCT3V0ZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgQkZfU09GVCkKICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCiAgICAgICAgewogICAgICAgICAgICBJbm5lckkgPSBSQklubmVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgICAgIE91dGVySSA9IFJCT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgSW5uZXJJID0gTFRJbm5lclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBMVE91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkKICAgICAgICB7CiAgICAgICAgICAgIElubmVySSA9IFJCSW5uZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBSQk91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgSW5uZXJJID0gTFRJbm5lck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgICAgIE91dGVySSA9IExUT3V0ZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIH0KICAgIH0KCiAgICBpZihJbm5lckkgIT0gLTEpIElubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4oSW5uZXJJKTsKICAgIGlmKE91dGVySSAhPSAtMSkgT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbihPdXRlckkpOwoKICAgIE1vdmVUb0V4KGhkYywgMCwgMCwgJlNhdmVQb2ludCk7CgogICAgLyogRG9uJ3QgYXNrIG1lIHdoeSwgYnV0IHRoaXMgaXMgd2hhdCBpcyB2aXNpYmxlLi4uICovCiAgICAvKiBUaGlzIG11c3QgYmUgcG9zc2libGUgdG8gZG8gbXVjaCBzaW1wbGVyLCBidXQgSSBmYWlsIHRvICovCiAgICAvKiBzZWUgdGhlIGxvZ2ljIGluIHRoZSBNUyBpbXBsZW1lbnRhdGlvbiAoc2lnaC4uLikuICovCiAgICAvKiBTbywgdGhpcyBtaWdodCBsb29rIGEgYml0IGJydXRlIGZvcmNlIGhlcmUgKGFuZCBpdCBpcyksIGJ1dCAqLwogICAgLyogaXQgZ2V0cyB0aGUgam9iIGRvbmU7KSAqLwoKICAgIHN3aXRjaCh1RmxhZ3MgJiBCRl9SRUNUKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSBCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT006CiAgICBjYXNlIEJGX0JPVFRPTUxFRlQ6CiAgICAgICAgLyogTGVmdCBib3R0b20gZW5kcG9pbnQgKi8KICAgICAgICBlcHggPSByYy0+bGVmdC0xOwogICAgICAgIHNweCA9IGVweCArIFNtYWxsRGlhbTsKICAgICAgICBlcHkgPSByYy0+Ym90dG9tOwogICAgICAgIHNweSA9IGVweSAtIFNtYWxsRGlhbTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEJGX1RPUExFRlQ6CiAgICBjYXNlIEJGX0JPVFRPTVJJR0hUOgogICAgICAgIC8qIExlZnQgdG9wIGVuZHBvaW50ICovCiAgICAgICAgZXB4ID0gcmMtPmxlZnQtMTsKICAgICAgICBzcHggPSBlcHggKyBTbWFsbERpYW07CiAgICAgICAgZXB5ID0gcmMtPnRvcC0xOwogICAgICAgIHNweSA9IGVweSArIFNtYWxsRGlhbTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEJGX1RPUDoKICAgIGNhc2UgQkZfUklHSFQ6CiAgICBjYXNlIEJGX1RPUFJJR0hUOgogICAgY2FzZSBCRl9SSUdIVHxCRl9MRUZUOgogICAgY2FzZSBCRl9SSUdIVHxCRl9MRUZUfEJGX1RPUDoKICAgIGNhc2UgQkZfQk9UVE9NfEJGX1RPUDoKICAgIGNhc2UgQkZfQk9UVE9NfEJGX1RPUHxCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT01SSUdIVHxCRl9MRUZUOgogICAgY2FzZSBCRl9CT1RUT01SSUdIVHxCRl9UT1A6CiAgICBjYXNlIEJGX1JFQ1Q6CiAgICAgICAgLyogUmlnaHQgdG9wIGVuZHBvaW50ICovCiAgICAgICAgc3B4ID0gcmMtPmxlZnQ7CiAgICAgICAgZXB4ID0gc3B4ICsgU21hbGxEaWFtOwogICAgICAgIHNweSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBlcHkgPSBzcHkgLSBTbWFsbERpYW07CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgTW92ZVRvRXgoaGRjLCBzcHgsIHNweSwgTlVMTCk7CiAgICBTZWxlY3RPYmplY3QoaGRjLCBPdXRlclBlbik7CiAgICBMaW5lVG8oaGRjLCBlcHgsIGVweSk7CgogICAgU2VsZWN0T2JqZWN0KGhkYywgSW5uZXJQZW4pOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAoQkZfUkVDVHxCRl9ESUFHT05BTCkpCiAgICB7CiAgICBjYXNlIEJGX0RJQUdPTkFMX0VOREJPVFRPTUxFRlQ6CiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT00pOgogICAgY2FzZSBCRl9ESUFHT05BTDoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0xFRlQpOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LTEsIHNweSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHktMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBzcHgtYWRkOwogICAgICAgIFBvaW50c1swXS55ID0gc3B5OwogICAgICAgIFBvaW50c1sxXS54ID0gcmMtPmxlZnQ7CiAgICAgICAgUG9pbnRzWzFdLnkgPSByYy0+dG9wOwogICAgICAgIFBvaW50c1syXS54ID0gZXB4KzE7CiAgICAgICAgUG9pbnRzWzJdLnkgPSBlcHktMS1hZGQ7CiAgICAgICAgUG9pbnRzWzNdID0gUG9pbnRzWzJdOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQkZfRElBR09OQUxfRU5EQk9UVE9NUklHSFQ6CiAgICAgICAgTW92ZVRvRXgoaGRjLCBzcHgtMSwgc3B5LCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBlcHgsIGVweSsxKTsKICAgICAgICBQb2ludHNbMF0ueCA9IHNweC1hZGQ7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBzcHk7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+bGVmdDsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBQb2ludHNbMl0ueCA9IGVweCsxOwogICAgICAgIFBvaW50c1syXS55ID0gZXB5KzErYWRkOwogICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT018QkZfUklHSFR8QkZfVE9QKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTXxCRl9SSUdIVHxCRl9UT1B8QkZfTEVGVCk6CiAgICBjYXNlIEJGX0RJQUdPTkFMX0VORFRPUFJJR0hUOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFR8QkZfVE9QfEJGX0xFRlQpOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4KzEsIHNweSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHkrMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBlcHgtMTsKICAgICAgICBQb2ludHNbMF0ueSA9IGVweSsxK2FkZDsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcCthZGQ7CiAgICAgICAgUG9pbnRzWzJdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMl0ueSA9IHJjLT5ib3R0b20tMTsKICAgICAgICBQb2ludHNbM10ueCA9IHNweCthZGQ7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBCRl9ESUFHT05BTF9FTkRUT1BMRUZUOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LCBzcHktMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4KzEsIGVweSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBlcHgrMSthZGQ7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBlcHkrMTsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKICAgICAgICBQb2ludHNbMl0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1syXS55ID0gcmMtPmJvdHRvbS0xLWFkZDsKICAgICAgICBQb2ludHNbM10ueCA9IHNweDsKICAgICAgICBQb2ludHNbM10ueSA9IHNweS1hZGQ7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfVE9QKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTXxCRl9UT1ApOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfQk9UVE9NfEJGX1RPUHxCRl9MRUZUKToKICAgICAgICBNb3ZlVG9FeChoZGMsIHNweCsxLCBzcHktMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHkpOwogICAgICAgIFBvaW50c1swXS54ID0gZXB4LTE7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBlcHkrMTsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKICAgICAgICBQb2ludHNbMl0ueCA9IHJjLT5yaWdodC0xOwogICAgICAgIFBvaW50c1syXS55ID0gcmMtPmJvdHRvbS0xLWFkZDsKICAgICAgICBQb2ludHNbM10ueCA9IHNweCthZGQ7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHktYWRkOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUfEJGX0xFRlQpOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFR8QkZfTEVGVHxCRl9CT1RUT00pOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LCBzcHksIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIGVweC0xLCBlcHkrMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBzcHg7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBzcHk7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+bGVmdDsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3ArYWRkOwogICAgICAgIFBvaW50c1syXS54ID0gZXB4LTEtYWRkOwogICAgICAgIFBvaW50c1syXS55ID0gZXB5KzErYWRkOwogICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICAvKiBGaWxsIHRoZSBpbnRlcmlvciBpZiBhc2tlZCAqLwogICAgaWYoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKQogICAgewogICAgICAgIEhCUlVTSCBoYnNhdmU7CiAgICAgICAgSEJSVVNIIGhiID0gR2V0U3lzQ29sb3JCcnVzaCh1RmxhZ3MgJiBCRl9NT05PID8gQ09MT1JfV0lORE9XCgkJCQkJIDpDT0xPUl9CVE5GQUNFKTsKICAgICAgICBIUEVOIGhwc2F2ZTsKICAgICAgICBIUEVOIGhwID0gR2V0U3lzQ29sb3JQZW4odUZsYWdzICYgQkZfTU9OTyA/IENPTE9SX1dJTkRPVwoJCQkJICAgICA6IENPTE9SX0JUTkZBQ0UpOwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGhkYywgaGIpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGhkYywgUG9pbnRzLCA0KTsKICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBoYnNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChoZGMsIGhwc2F2ZSk7CiAgICB9CgogICAgLyogQWRqdXN0IHJlY3RhbmdsZSBpZiBhc2tlZCAqLwogICAgaWYodUZsYWdzICYgQkZfQURKVVNUKQogICAgewogICAgICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpICAgcmMtPmxlZnQgICArPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfUklHSFQpICByYy0+cmlnaHQgIC09IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9UT1ApICAgIHJjLT50b3AgICAgKz0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkgcmMtPmJvdHRvbSAtPSBhZGQ7CiAgICB9CgogICAgLyogQ2xlYW51cCAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgU2F2ZVBlbik7CiAgICBNb3ZlVG9FeChoZGMsIFNhdmVQb2ludC54LCBTYXZlUG9pbnQueSwgTlVMTCk7CgogICAgcmV0dXJuIHJldHZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBVSVRPT0xTX0RyYXdSZWN0RWRnZQogKgogKiBTYW1lIGFzIERyYXdFZGdlIGludm9rZWQgd2l0aG91dCBCRl9ESUFHT05BTAogKgogKiAyMy1Ob3YtMTk5NzogQ2hhbmdlZCBieSBCZXJ0aG8gU3R1bHRpZW5zCiAqCiAqIFdlbGwsIEkgc3RhcnRlZCB0ZXN0aW5nIHRoaXMgYW5kIGZvdW5kIG91dCB0aGF0IHRoZXJlIGFyZSBhIGZldyB0aGluZ3MKICogdGhhdCB3ZXJlbid0IHF1aXRlIGFzIHdpbjk1LiBUaGUgZm9sbG93aW5nIHJld3JpdGUgc2hvdWxkIHJlcHJvZHVjZQogKiB3aW45NSByZXN1bHRzIGNvbXBsZXRlbHkuCiAqIFRoZSBjb2xvcnNlbGVjdGlvbiBpcyB0YWJsZS1kcml2ZW4gdG8gYXZvaWQgYXdmdWxsIGlmLXN0YXRlbWVudHMuCiAqIFRoZSB0YWJsZSBiZWxvdyBzaG93IHRoZSBjb2xvciBzZXR0aW5ncy4KICoKICogUGVuIHNlbGVjdGlvbiB0YWJsZSBmb3IgdUZsYWdzID0gMAogKgogKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAwMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDAwMDEgfCAgIHggICB8ICAyMiAgIHwgICB4ICAgfCAgMjEKICogIDAwMTAgfCAgIHggICB8ICAxNiAgIHwgICB4ICAgfCAgMjAKICogIDAwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAxMDAgfCAgIHggICB8ICAyMCAgIHwgICB4ICAgfCAgMTYKICogIDAxMDEgfCAgMjAgICB8ICAyMiAgIHwgIDE2ICAgfCAgMjEKICogIDAxMTAgfCAgMjAgICB8ICAxNiAgIHwgIDE2ICAgfCAgMjAKICogIDAxMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDEwMDAgfCAgIHggICB8ICAyMSAgIHwgICB4ICAgfCAgMjIKICogIDEwMDEgfCAgMjEgICB8ICAyMiAgIHwgIDIyICAgfCAgMjEKICogIDEwMTAgfCAgMjEgICB8ICAxNiAgIHwgIDIyICAgfCAgMjAKICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDExMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDExMDEgfCAgIHggICB8IHggKDIyKXwgICB4ICAgfCB4ICgyMSkKICogIDExMTAgfCAgIHggICB8IHggKDE2KXwgICB4ICAgfCB4ICgyMCkKICogIDExMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICoKICogUGVuIHNlbGVjdGlvbiB0YWJsZSBmb3IgdUZsYWdzID0gQkZfU09GVAogKgogKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAwMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDAwMDEgfCAgIHggICB8ICAyMCAgIHwgICB4ICAgfCAgMjEKICogIDAwMTAgfCAgIHggICB8ICAyMSAgIHwgICB4ICAgfCAgMjAKICogIDAwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDAxMDAgfCAgIHggICB8ICAyMiAgIHwgICB4ICAgfCAgMTYKICogIDAxMDEgfCAgMjIgICB8ICAyMCAgIHwgIDE2ICAgfCAgMjEKICogIDAxMTAgfCAgMjIgICB8ICAyMSAgIHwgIDE2ICAgfCAgMjAKICogIDAxMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDEwMDAgfCAgIHggICB8ICAxNiAgIHwgICB4ICAgfCAgMjIKICogIDEwMDEgfCAgMTYgICB8ICAyMCAgIHwgIDIyICAgfCAgMjEKICogIDEwMTAgfCAgMTYgICB8ICAyMSAgIHwgIDIyICAgfCAgMjAKICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KICogIDExMDAgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICogIDExMDEgfCAgIHggICB8IHggKDIwKXwgICB4ICAgfCB4ICgyMSkKICogIDExMTAgfCAgIHggICB8IHggKDIxKXwgICB4ICAgfCB4ICgyMCkKICogIDExMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKICoKICogeCA9IGRvbid0IGNhcmU7IChuKSA9IGlzIHdoYXQgd2luOTUgYWN0dWFsbHkgdXNlcwogKiBMVEkgPSBsZWZ0IFRvcCBJbm5lciBsaW5lCiAqIExUTyA9IGxlZnQgVG9wIE91dGVyIGxpbmUKICogUkJJID0gUmlnaHQgQm90dG9tIElubmVyIGxpbmUKICogUkJPID0gUmlnaHQgQm90dG9tIE91dGVyIGxpbmUKICogMTUgPSBDT0xPUl9CVE5GQUNFCiAqIDE2ID0gQ09MT1JfQlROU0hBRE9XCiAqIDIwID0gQ09MT1JfQlROSElHSExJR0hUCiAqIDIxID0gQ09MT1JfM0RES1NIQURPVwogKiAyMiA9IENPTE9SXzNETElHSFQKICovCgoKc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShIREMgaGRjLCBMUFJFQ1QgcmMsIAoJCQkJICAgICBVSU5UIHVUeXBlLCBVSU5UIHVGbGFncykKewogICAgY2hhciBMVElubmVySSwgTFRPdXRlckk7CiAgICBjaGFyIFJCSW5uZXJJLCBSQk91dGVySTsKICAgIEhQRU4gTFRJbm5lclBlbiwgTFRPdXRlclBlbjsKICAgIEhQRU4gUkJJbm5lclBlbiwgUkJPdXRlclBlbjsKICAgIFJFQ1QgSW5uZXJSZWN0ID0gKnJjOwogICAgUE9JTlQgU2F2ZVBvaW50OwogICAgSFBFTiBTYXZlUGVuOwogICAgaW50IExCcGVucGx1cyA9IDA7CiAgICBpbnQgTFRwZW5wbHVzID0gMDsKICAgIGludCBSVHBlbnBsdXMgPSAwOwogICAgaW50IFJCcGVucGx1cyA9IDA7CiAgICBCT09MIHJldHZhbCA9ICEoICAgKCh1VHlwZSAmIEJEUl9JTk5FUikgPT0gQkRSX0lOTkVSCiAgICAgICAgICAgICAgICAgICAgICAgfHwgKHVUeXBlICYgQkRSX09VVEVSKSA9PSBCRFJfT1VURVIpCiAgICAgICAgICAgICAgICAgICAgICAmJiAhKHVGbGFncyAmIChCRl9GTEFUfEJGX01PTk8pKSApOwogICAgICAgIAogICAgLyogSW5pdCBzb21lIHZhcnMgKi8KICAgIExUSW5uZXJQZW4gPSBMVE91dGVyUGVuID0gUkJJbm5lclBlbiA9IFJCT3V0ZXJQZW4gPSAoSFBFTilHZXRTdG9ja09iamVjdChOVUxMX1BFTik7CiAgICBTYXZlUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KGhkYywgTFRJbm5lclBlbik7CgogICAgLyogRGV0ZXJtaW5lIHRoZSBjb2xvcnMgb2YgdGhlIGVkZ2VzICovCiAgICBpZih1RmxhZ3MgJiBCRl9NT05PKQogICAgewogICAgICAgIExUSW5uZXJJID0gUkJJbm5lckkgPSBMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBMVE91dGVySSA9IFJCT3V0ZXJJID0gTFRSQk91dGVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICB9CiAgICBlbHNlIGlmKHVGbGFncyAmIEJGX0ZMQVQpCiAgICB7CiAgICAgICAgTFRJbm5lckkgPSBSQklubmVySSA9IExUUkJJbm5lckZsYXRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIExUT3V0ZXJJID0gUkJPdXRlckkgPSBMVFJCT3V0ZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKCiAgICAgICAgLyogQmVydGhvIFN0dWx0aWVucyBzdGF0ZXMgYWJvdmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGV4YWN0bHkgbWF0Y2hlcyB3aW45NQogICAgICAgICAqIEluIHdpbjk4IEJGX0ZMQVQgcmVjdGFuZ2VscyBoYXZlIGFuIGlubmVyIGJvcmRlciBzYW1lIGNvbG9yIGFzIHRoZQoJICogbWlkZGxlIChDT0xPUl9CVE5GQUNFKS4gSSBiZWxpZXZlIGl0J3MgdGhlIHNhbWUgZm9yIHdpbjk1IGJ1dCBzaW5jZQoJICogSSBkb24ndCBrbm93IEkgZ28gd2l0aCBCZXJ0aG8gYW5kIGp1c3Qgc2V0cyBpdCBmb3Igd2luOTggdW50aWwgcHJvdmVuCgkgKiBvdGhlcndpc2UuCgkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbm5pcyBCavZya2x1bmQsIDEwIEp1bmUsIDk5CgkgKi8KCWlmKCBUV0VBS19XaW5lTG9vayA9PSBXSU45OF9MT09LICYmIExUSW5uZXJJICE9IC0xICkJICAKICAgICAgICAgICAgTFRJbm5lckkgPSBSQklubmVySSA9IENPTE9SX0JUTkZBQ0U7CiAgICB9CiAgICBlbHNlIGlmKHVGbGFncyAmIEJGX1NPRlQpCiAgICB7CiAgICAgICAgTFRJbm5lckkgPSBMVElubmVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgTFRPdXRlckkgPSBMVE91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgUkJJbm5lckkgPSBSQklubmVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgUkJPdXRlckkgPSBSQk91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgTFRJbm5lckkgPSBMVElubmVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBMVE91dGVySSA9IExUT3V0ZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIFJCSW5uZXJJID0gUkJJbm5lck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgUkJPdXRlckkgPSBSQk91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgIH0KCiAgICBpZigodUZsYWdzICYgQkZfQk9UVE9NTEVGVCkgPT0gQkZfQk9UVE9NTEVGVCkgICBMQnBlbnBsdXMgPSAxOwogICAgaWYoKHVGbGFncyAmIEJGX1RPUFJJR0hUKSA9PSBCRl9UT1BSSUdIVCkgICAgICAgUlRwZW5wbHVzID0gMTsKICAgIGlmKCh1RmxhZ3MgJiBCRl9CT1RUT01SSUdIVCkgPT0gQkZfQk9UVE9NUklHSFQpIFJCcGVucGx1cyA9IDE7CiAgICBpZigodUZsYWdzICYgQkZfVE9QTEVGVCkgPT0gQkZfVE9QTEVGVCkgICAgICAgICBMVHBlbnBsdXMgPSAxOwoKICAgIGlmKExUSW5uZXJJICE9IC0xKSBMVElubmVyUGVuID0gR2V0U3lzQ29sb3JQZW4oTFRJbm5lckkpOwogICAgaWYoTFRPdXRlckkgIT0gLTEpIExUT3V0ZXJQZW4gPSBHZXRTeXNDb2xvclBlbihMVE91dGVySSk7CiAgICBpZihSQklubmVySSAhPSAtMSkgUkJJbm5lclBlbiA9IEdldFN5c0NvbG9yUGVuKFJCSW5uZXJJKTsKICAgIGlmKFJCT3V0ZXJJICE9IC0xKSBSQk91dGVyUGVuID0gR2V0U3lzQ29sb3JQZW4oUkJPdXRlckkpOwoKICAgIE1vdmVUb0V4KGhkYywgMCwgMCwgJlNhdmVQb2ludCk7CgogICAgLyogRHJhdyB0aGUgb3V0ZXIgZWRnZSAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgTFRPdXRlclBlbik7CiAgICBpZih1RmxhZ3MgJiBCRl9UT1ApCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QubGVmdCwgSW5uZXJSZWN0LnRvcCwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LnJpZ2h0LCBJbm5lclJlY3QudG9wKTsKICAgIH0KICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QubGVmdCwgSW5uZXJSZWN0LnRvcCwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LmxlZnQsIElubmVyUmVjdC5ib3R0b20pOwogICAgfQogICAgU2VsZWN0T2JqZWN0KGhkYywgUkJPdXRlclBlbik7CiAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QucmlnaHQtMSwgSW5uZXJSZWN0LmJvdHRvbS0xLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QubGVmdC0xLCBJbm5lclJlY3QuYm90dG9tLTEpOwogICAgfQogICAgaWYodUZsYWdzICYgQkZfUklHSFQpCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QucmlnaHQtMSwgSW5uZXJSZWN0LmJvdHRvbS0xLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QucmlnaHQtMSwgSW5uZXJSZWN0LnRvcC0xKTsKICAgIH0KCiAgICAvKiBEcmF3IHRoZSBpbm5lciBlZGdlICovCiAgICBTZWxlY3RPYmplY3QoaGRjLCBMVElubmVyUGVuKTsKICAgIGlmKHVGbGFncyAmIEJGX1RPUCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5sZWZ0K0xUcGVucGx1cywgSW5uZXJSZWN0LnRvcCsxLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QucmlnaHQtUlRwZW5wbHVzLCBJbm5lclJlY3QudG9wKzEpOwogICAgfQogICAgaWYodUZsYWdzICYgQkZfTEVGVCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5sZWZ0KzEsIElubmVyUmVjdC50b3ArTFRwZW5wbHVzLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QubGVmdCsxLCBJbm5lclJlY3QuYm90dG9tLUxCcGVucGx1cyk7CiAgICB9CiAgICBTZWxlY3RPYmplY3QoaGRjLCBSQklubmVyUGVuKTsKICAgIGlmKHVGbGFncyAmIEJGX0JPVFRPTSkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5yaWdodC0xLVJCcGVucGx1cywgSW5uZXJSZWN0LmJvdHRvbS0yLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QubGVmdC0xK0xCcGVucGx1cywgSW5uZXJSZWN0LmJvdHRvbS0yKTsKICAgIH0KICAgIGlmKHVGbGFncyAmIEJGX1JJR0hUKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LnJpZ2h0LTIsIElubmVyUmVjdC5ib3R0b20tMS1SQnBlbnBsdXMsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5yaWdodC0yLCBJbm5lclJlY3QudG9wLTErUlRwZW5wbHVzKTsKICAgIH0KCiAgICBpZiggKCh1RmxhZ3MgJiBCRl9NSURETEUpICYmIHJldHZhbCkgfHwgKHVGbGFncyAmIEJGX0FESlVTVCkgKQogICAgewogICAgICAgIGludCBhZGQgPSAoTFRSQklubmVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV0gIT0gLTEgPyAxIDogMCkKICAgICAgICAgICAgICAgICsgKExUUkJPdXRlck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApOwoKICAgICAgICBpZih1RmxhZ3MgJiBCRl9MRUZUKSAgIElubmVyUmVjdC5sZWZ0ICAgKz0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX1JJR0hUKSAgSW5uZXJSZWN0LnJpZ2h0ICAtPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfVE9QKSAgICBJbm5lclJlY3QudG9wICAgICs9IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pIElubmVyUmVjdC5ib3R0b20gLT0gYWRkOwoKICAgICAgICBpZigodUZsYWdzICYgQkZfTUlERExFKSAmJiByZXR2YWwpCgl7IAogICAgICAgICAgICBGaWxsUmVjdChoZGMsICZJbm5lclJlY3QsIEdldFN5c0NvbG9yQnJ1c2godUZsYWdzICYgQkZfTU9OTyA/IAoJCQkJCQkgICAgICAgQ09MT1JfV0lORE9XIDogQ09MT1JfQlRORkFDRSkpOwoJfQoKCWlmKHVGbGFncyAmIEJGX0FESlVTVCkKCSAgICAqcmMgPSBJbm5lclJlY3Q7CiAgICB9CgogICAgLyogQ2xlYW51cCAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgU2F2ZVBlbik7CiAgICBNb3ZlVG9FeChoZGMsIFNhdmVQb2ludC54LCBTYXZlUG9pbnQueSwgTlVMTCk7CiAgICByZXR1cm4gcmV0dmFsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgRHJhd0VkZ2UxNiAgIChVU0VSLjY1OSkKICovCkJPT0wxNiBXSU5BUEkgRHJhd0VkZ2UxNiggSERDMTYgaGRjLCBMUFJFQ1QxNiByYywgVUlOVDE2IGVkZ2UsIFVJTlQxNiBmbGFncyApCnsKICAgIFJFQ1QgcmVjdDMyOwogICAgQk9PTCByZXQ7CgogICAgQ09OVl9SRUNUMTZUTzMyKCByYywgJnJlY3QzMiApOwogICAgcmV0ID0gRHJhd0VkZ2UoIGhkYywgJnJlY3QzMiwgZWRnZSwgZmxhZ3MgKTsKICAgIENPTlZfUkVDVDMyVE8xNiggJnJlY3QzMiwgcmMgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdFZGdlMzIgICAoVVNFUjMyLjE1NSkKICovCkJPT0wgV0lOQVBJIERyYXdFZGdlKCBIREMgaGRjLCBMUFJFQ1QgcmMsIFVJTlQgZWRnZSwgVUlOVCBmbGFncyApCnsKICAgIFRSQUNFKCIlMDR4ICVkLCVkLSVkLCVkICUwNHggJTA0eFxuIiwKCSAgaGRjLCByYy0+bGVmdCwgcmMtPnRvcCwgcmMtPnJpZ2h0LCByYy0+Ym90dG9tLCBlZGdlLCBmbGFncyApOwoKICAgIGlmKGZsYWdzICYgQkZfRElBR09OQUwpCiAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd0RpYWdFZGdlKGhkYywgcmMsIGVkZ2UsIGZsYWdzKTsKICAgIGVsc2UKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoaGRjLCByYywgZWRnZSwgZmxhZ3MpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVSVRPT0xTX01ha2VTcXVhcmVSZWN0CiAqCiAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgc3F1YXJlIHJlY3RhbmdsZSBhbmQgcmV0dXJuaW5nIHRoZSB3aWR0aAogKi8Kc3RhdGljIGludCBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KExQUkVDVCBzcmMsIExQUkVDVCBkc3QpCnsKICAgIGludCBXaWR0aCAgPSBzcmMtPnJpZ2h0IC0gc3JjLT5sZWZ0OwogICAgaW50IEhlaWdodCA9IHNyYy0+Ym90dG9tIC0gc3JjLT50b3A7CiAgICBpbnQgU21hbGxEaWFtID0gV2lkdGggPiBIZWlnaHQgPyBIZWlnaHQgOiBXaWR0aDsKCiAgICAqZHN0ID0gKnNyYzsKCiAgICAvKiBNYWtlIGl0IGEgc3F1YXJlIGJveCAqLwogICAgaWYoV2lkdGggPCBIZWlnaHQpICAgICAgLyogU21hbGxEaWFtID09IFdpZHRoICovCiAgICB7CiAgICAgICAgZHN0LT50b3AgKz0gKEhlaWdodC1XaWR0aCkvMjsKICAgICAgICBkc3QtPmJvdHRvbSA9IGRzdC0+dG9wICsgU21hbGxEaWFtOwogICAgfQogICAgZWxzZSBpZihXaWR0aCA+IEhlaWdodCkgLyogU21hbGxEaWFtID09IEhlaWdodCAqLwogICAgewogICAgICAgIGRzdC0+bGVmdCArPSAoV2lkdGgtSGVpZ2h0KS8yOwogICAgICAgIGRzdC0+cmlnaHQgPSBkc3QtPmxlZnQgKyBTbWFsbERpYW07CiAgICB9CgogICByZXR1cm4gU21hbGxEaWFtOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVSVRPT0xTX0RGQ19CdXR0b25QdXNoCiAqCiAqIERyYXcgYSBwdXNoIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICoKICogRG9lcyBhIHByZXR0eSBnb29kIGpvYiBpbiBlbXVsYXRpbmcgTVMgYmVoYXZpb3IuIFNvbWUgcXVpcmtzIGFyZQogKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKICogdGhlIGJ1dHRvbnMuCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2goSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFVJTlQgZWRnZTsKICAgIFJFQ1QgbXlyID0gKnI7CgogICAgaWYodUZsYWdzICYgKERGQ1NfUFVTSEVEIHwgREZDU19DSEVDS0VEIHwgREZDU19GTEFUKSkKICAgICAgICBlZGdlID0gRURHRV9TVU5LRU47CiAgICBlbHNlCiAgICAgICAgZWRnZSA9IEVER0VfUkFJU0VEOwoKICAgIGlmKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkKICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBERkNTX01PTk8pCiAgICAgICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsICZteXIsIGVkZ2UsIEJGX01PTk98QkZfUkVDVHxCRl9BREpVU1QpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpfEJGX1JFQ1R8QkZfU09GVHxCRl9BREpVU1QpOwoKICAgICAgICBpZihHZXRTeXNDb2xvcihDT0xPUl9CVE5ISUdITElHSFQpID09IFJHQigyNTUsIDI1NSwgMjU1KSkKICAgICAgICB7CiAgICAgICAgICAgIEhCSVRNQVAgaGJtID0gQ3JlYXRlQml0bWFwKDgsIDgsIDEsIDEsIHdQYXR0ZXJuX0FBNTUpOwogICAgICAgICAgICBIQlJVU0ggaGJzYXZlOwogICAgICAgICAgICBIQlJVU0ggaGIgPSBDcmVhdGVQYXR0ZXJuQnJ1c2goaGJtKTsKCiAgICAgICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKICAgICAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgICAgICAgUGF0Qmx0KGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LW15ci5sZWZ0LCBteXIuYm90dG9tLW15ci50b3AsIDB4MDBGQTAwODkpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICAgICAgICAgIERlbGV0ZU9iamVjdChoYik7CiAgICAgICAgICAgIERlbGV0ZU9iamVjdChoYm0pOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBGaWxsUmVjdChkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYodUZsYWdzICYgREZDU19NT05PKQogICAgICAgIHsKICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgQkZfTU9OT3xCRl9SRUNUfEJGX0FESlVTVCk7CiAgICAgICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpIHwgQkZfTUlERExFIHxCRl9TT0ZUfCBCRl9SRUNUKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQWRqdXN0IHJlY3RhbmdsZSBpZiBhc2tlZCAqLwogICAgaWYodUZsYWdzICYgREZDU19BREpVU1RSRUNUKQogICAgewogICAgICAgIHItPmxlZnQgICArPSAyOwogICAgICAgIHItPnJpZ2h0ICAtPSAyOwogICAgICAgIHItPnRvcCAgICArPSAyOwogICAgICAgIHItPmJvdHRvbSAtPSAyOwogICAgfQoKICAgIHJldHVybiBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVSVRPT0xTX0RGQ19CdXR0b25DaGNlawogKgogKiBEcmF3IGEgY2hlY2svM3N0YXRlIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICoKICogRG9lcyBhIHByZXR0eSBnb29kIGpvYiBpbiBlbXVsYXRpbmcgTVMgYmVoYXZpb3IuIFNvbWUgcXVpcmtzIGFyZQogKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKICogdGhlIGJ1dHRvbnMuCiAqLwojZGVmaW5lIERGQ19DSEVDS1BPSU5UU01BWCAgICAgIDYKCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9ERkNfQnV0dG9uQ2hlY2soSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICBpbnQgQm9yZGVyU2hyaW5rID0gU21hbGxEaWFtIC8gMTY7CgogICAgaWYoQm9yZGVyU2hyaW5rIDwgMSkgQm9yZGVyU2hyaW5rID0gMTsKCiAgICAvKiBGSVhNRTogVGhlIEZpbGxSZWN0KCkgc2VxdWVuY2UgZG9lc24ndCB3b3JrIGZvciBzaXplcyBsZXNzIHRoYW4gKi8KICAgIC8qIDQgcGl4ZWxzIGluIGRpYW1ldGVyLiBOb3QgcmVhbGx5IGEgcHJvYmxlbSBidXQgaXQgaXNuJ3QgTSQncyAqLwogICAgLyogMTAwJSBlcXVpdmFsZW50LiAqLwogICAgaWYodUZsYWdzICYgKERGQ1NfRkxBVHxERkNTX01PTk8pKQogICAgewogICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX1dJTkRPV0ZSQU1FKSk7CiAgICAgICAgbXlyLmxlZnQgICArPSAyICogQm9yZGVyU2hyaW5rOwogICAgICAgIG15ci5yaWdodCAgLT0gMiAqIEJvcmRlclNocmluazsKICAgICAgICBteXIudG9wICAgICs9IDIgKiBCb3JkZXJTaHJpbms7CiAgICAgICAgbXlyLmJvdHRvbSAtPSAyICogQm9yZGVyU2hyaW5rOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIG15ci5yaWdodCAgLT0gQm9yZGVyU2hyaW5rOwogICAgICAgIG15ci5ib3R0b20gLT0gQm9yZGVyU2hyaW5rOwogICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTlNIQURPVykpOwogICAgICAgIG15ci5sZWZ0ICAgKz0gQm9yZGVyU2hyaW5rOwogICAgICAgIG15ci50b3AgICAgKz0gQm9yZGVyU2hyaW5rOwogICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SXzNETElHSFQpKTsKICAgICAgICBteXIucmlnaHQgIC09IEJvcmRlclNocmluazsKICAgICAgICBteXIuYm90dG9tIC09IEJvcmRlclNocmluazsKICAgICAgICBGaWxsUmVjdChkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl8zRERLU0hBRE9XKSk7CiAgICAgICAgbXlyLmxlZnQgICArPSBCb3JkZXJTaHJpbms7CiAgICAgICAgbXlyLnRvcCAgICArPSBCb3JkZXJTaHJpbms7CiAgICB9CgogICAgaWYodUZsYWdzICYgKERGQ1NfSU5BQ1RJVkV8REZDU19QVVNIRUQpKQogICAgewogICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKICAgIH0KICAgIGVsc2UgaWYodUZsYWdzICYgREZDU19DSEVDS0VEKQogICAgewogICAgICAgIGlmKEdldFN5c0NvbG9yKENPTE9SX0JUTkhJR0hMSUdIVCkgPT0gUkdCKDI1NSwgMjU1LCAyNTUpKQogICAgICAgIHsKICAgICAgICAgICAgSEJJVE1BUCBoYm0gPSBDcmVhdGVCaXRtYXAoOCwgOCwgMSwgMSwgd1BhdHRlcm5fQUE1NSk7CiAgICAgICAgICAgIEhCUlVTSCBoYnNhdmU7CiAgICAgICAgICAgIEhCUlVTSCBoYiA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm0pOwoKICAgICAgICAgICAgRmlsbFJlY3QoZGMsICZteXIsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlRORkFDRSkpOwogICAgICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICAgICAgICBQYXRCbHQoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQtbXlyLmxlZnQsIG15ci5ib3R0b20tbXlyLnRvcCwgMHgwMEZBMDA4OSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhiKTsKICAgICAgICAgICAgRGVsZXRlT2JqZWN0KGhibSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIEZpbGxSZWN0KGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBGaWxsUmVjdChkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9XSU5ET1cpKTsKICAgIH0KCiAgICBpZih1RmxhZ3MgJiBERkNTX0NIRUNLRUQpCiAgICB7CiAgICAgICAgUE9JTlQgQ2hlY2tQb2ludHNbREZDX0NIRUNLUE9JTlRTTUFYXTsKICAgICAgICBpbnQgaTsKICAgICAgICBIQlJVU0ggaGJzYXZlOwogICAgICAgIEhQRU4gaHBzYXZlOwoKICAgICAgICAvKiBGSVhNRTogVGhpcyBjb21lcyB2ZXJ5IGNsb3NlIHRvIE0kJ3MgY2hlY2ttYXJrLCBidXQgbm90ICovCiAgICAgICAgLyogZXhhY3RseS4uLiBXaGVuIHNtYWxsIG9yIGxhcmdlIHRoZXJlIGlzIGEgZmV3IHBpeGVscyAqLwogICAgICAgIC8qIHNoaWZ0LiBOb3QgYmFkLCBidXQgY291bGQgYmUgYmV0dGVyIDopICovCiAgICAgICAgVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKTsKICAgICAgICBDaGVja1BvaW50c1swXS54ID0gbXlyLmxlZnQgKyAyNTMqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgQ2hlY2tQb2ludHNbMF0ueSA9IG15ci50b3AgICsgMzQ1KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIENoZWNrUG9pbnRzWzFdLnggPSBteXIubGVmdCArIDQwOSpTbWFsbERpYW0vMTAwMDsKICAgICAgICBDaGVja1BvaW50c1sxXS55ID0gQ2hlY2tQb2ludHNbMF0ueSArIChDaGVja1BvaW50c1sxXS54LUNoZWNrUG9pbnRzWzBdLngpOwogICAgICAgIENoZWNrUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDY5MCpTbWFsbERpYW0vMTAwMDsKICAgICAgICBDaGVja1BvaW50c1syXS55ID0gQ2hlY2tQb2ludHNbMV0ueSAtIChDaGVja1BvaW50c1syXS54LUNoZWNrUG9pbnRzWzFdLngpOwogICAgICAgIENoZWNrUG9pbnRzWzNdLnggPSBDaGVja1BvaW50c1syXS54OwogICAgICAgIENoZWNrUG9pbnRzWzNdLnkgPSBDaGVja1BvaW50c1syXS55ICsgMypTbWFsbERpYW0vMTY7CiAgICAgICAgQ2hlY2tQb2ludHNbNF0ueCA9IENoZWNrUG9pbnRzWzFdLng7CiAgICAgICAgQ2hlY2tQb2ludHNbNF0ueSA9IENoZWNrUG9pbnRzWzFdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBDaGVja1BvaW50c1s1XS54ID0gQ2hlY2tQb2ludHNbMF0ueDsKICAgICAgICBDaGVja1BvaW50c1s1XS55ID0gQ2hlY2tQb2ludHNbMF0ueSArIDMqU21hbGxEaWFtLzE2OwoKICAgICAgICBpID0gKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpIHx8ICh1RmxhZ3MgJiAweGZmKSA9PSBERkNTX0JVVFRPTjNTVEFURSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX1dJTkRPV1RFWFQ7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oaSkpOwogICAgICAgIFBvbHlnb24oZGMsIENoZWNrUG9pbnRzLCBERkNfQ0hFQ0tQT0lOVFNNQVgpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVUlUT09MU19ERkNfQnV0dG9uUmFkaW8KICoKICogRHJhdyBhIHJhZGlvL3JhZGlvaW1hZ2UvcmFkaW9tYXNrIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICoKICogRG9lcyBhIHByZXR0eSBnb29kIGpvYiBpbiBlbXVsYXRpbmcgTVMgYmVoYXZpb3IuIFNvbWUgcXVpcmtzIGFyZQogKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKICogdGhlIGJ1dHRvbnMuCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfREZDX0J1dHRvblJhZGlvKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBSRUNUIG15cjsKICAgIGludCBpOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICBpbnQgQm9yZGVyU2hyaW5rID0gU21hbGxEaWFtIC8gMTY7CiAgICBIUEVOIGhwc2F2ZTsKICAgIEhCUlVTSCBoYnNhdmU7CiAgICBpbnQgeGUsIHllOwogICAgaW50IHhjLCB5YzsKCiAgICBpZihCb3JkZXJTaHJpbmsgPCAxKSBCb3JkZXJTaHJpbmsgPSAxOwoKICAgIGlmKCh1RmxhZ3MgJiAweGZmKSA9PSBERkNTX0JVVFRPTlJBRElPSU1BR0UpCiAgICB7CiAgICAgICAgRmlsbFJlY3QoZGMsIHIsIChIQlJVU0gpR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKICAgIH0KCiAgICB4ZSA9IG15ci5sZWZ0OwogICAgeWUgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwoKICAgIHhjID0gbXlyLmxlZnQgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKICAgIHljID0gbXlyLnRvcCAgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKCiAgICAvKiBEZWZpbmUgYm91bmRpbmcgYm94ICovCiAgICBpID0gMTQqU21hbGxEaWFtLzE2OwogICAgbXlyLmxlZnQgICA9IHhjIC0gaStpLzI7CiAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgIG15ci5ib3R0b20gPSB5YyArIGkvMjsKCiAgICBpZigodUZsYWdzICYgMHhmZikgPT0gREZDU19CVVRUT05SQURJT01BU0spCiAgICB7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CiAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKHVGbGFncyAmIChERkNTX0ZMQVR8REZDU19NT05PKSkKICAgICAgICB7CiAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfV0lORE9XRlJBTUUpKTsKICAgICAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfV0lORE9XRlJBTUUpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIubGVmdC0xLCBteXIuYm90dG9tLCBteXIucmlnaHQtMSwgbXlyLnRvcCk7CgogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTlNIQURPVykpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlROU0hBRE9XKSk7CiAgICAgICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgbXlyLnJpZ2h0KzEsIG15ci50b3AsIG15ci5sZWZ0KzEsIG15ci5ib3R0b20pOwoKICAgICAgICAgICAgbXlyLmxlZnQgICArPSBCb3JkZXJTaHJpbms7CiAgICAgICAgICAgIG15ci5yaWdodCAgLT0gQm9yZGVyU2hyaW5rOwogICAgICAgICAgICBteXIudG9wICAgICs9IEJvcmRlclNocmluazsKICAgICAgICAgICAgbXlyLmJvdHRvbSAtPSBCb3JkZXJTaHJpbms7CgogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SXzNETElHSFQpKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SXzNETElHSFQpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIubGVmdC0xLCBteXIuYm90dG9tLCBteXIucmlnaHQtMSwgbXlyLnRvcCk7CgogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SXzNEREtTSEFET1cpKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SXzNEREtTSEFET1cpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIucmlnaHQrMSwgbXlyLnRvcCwgbXlyLmxlZnQrMSwgbXlyLmJvdHRvbSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIH0KCiAgICAgICAgaSA9IDEwKlNtYWxsRGlhbS8xNjsKICAgICAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKICAgICAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICAgICAgbXlyLnRvcCAgICA9IHljIC0gaStpLzI7CiAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwogICAgICAgIGk9ICEodUZsYWdzICYgKERGQ1NfSU5BQ1RJVkV8REZDU19QVVNIRUQpKSA/IENPTE9SX1dJTkRPVyA6IENPTE9SX0JUTkZBQ0U7CiAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihpKSk7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICB9CgogICAgaWYodUZsYWdzICYgREZDU19DSEVDS0VEKQogICAgewogICAgICAgIGkgPSA2KlNtYWxsRGlhbS8xNjsKICAgICAgICBpID0gaSA8IDEgPyAxIDogaTsKICAgICAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKICAgICAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICAgICAgbXlyLnRvcCAgICA9IHljIC0gaStpLzI7CiAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwoKICAgICAgICBpID0gdUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX1dJTkRPV1RFWFQ7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oaSkpOwogICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CgogICAgLyogRklYTUU6IE0kIGhhcyBhIHBvbHlnb24gaW4gdGhlIGNlbnRlciBhdCByZWxhdGl2ZSBwb2ludHM6ICovCiAgICAvKiAwLjQ3NiwgMC40NzYgKHRpbWVzIFNtYWxsRGlhbSwgU21hbGxEaWFtKSAqLwogICAgLyogMC40NzYsIDAuNTI1ICovCiAgICAvKiAwLjUwMCwgMC41MDAgKi8KICAgIC8qIDAuNTAwLCAwLjQ5OSAqLwogICAgLyogd2hlbiB0aGUgYnV0dG9uIGlzIHVuY2hlY2tlZC4gVGhlIHJlYXNvbiBmb3IgaXQgaXMgdW5rbm93bi4gVGhlICovCiAgICAvKiBjb2xvciBpcyBDT0xPUl9CVE5ISUdITElHSFQsIGFsdGhvdWdoIHRoZSBwb2x5Z29uIGdldHMgcGFpbnRlZCBhdCAqLwogICAgLyogbGVhc3QgMyB0aW1lcyAoaXQgbG9va3MgbGlrZSBhIGNsaXAtcmVnaW9uIHdoZW4geW91IHNlZSBpdCBoYXBwZW4pLiAqLwogICAgLyogSSBkbyBub3QgcmVhbGx5IHNlZSBhIHJlYXNvbiB3aHkgdGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQuIElmIHlvdSAqLwogICAgLyogaGF2ZSBhIGdvb2QgcmVhc29uLCBsZXQgbWUga25vdy4gTWF5YmUgdGhpcyBpcyBhIHF1aXJrIGluIHRoZSBNYXJsZXR0ICovCiAgICAvKiBmb250LiAqLwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lQnV0dG9uCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfRHJhd0ZyYW1lQnV0dG9uKEhEQyBoZGMsIExQUkVDVCByYywgVUlOVCB1U3RhdGUpCnsKICAgIHN3aXRjaCh1U3RhdGUgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX0JVVFRPTlBVU0g6CiAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChoZGMsIHJjLCB1U3RhdGUpOwoKICAgIGNhc2UgREZDU19CVVRUT05DSEVDSzoKICAgIGNhc2UgREZDU19CVVRUT04zU1RBVEU6CiAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uQ2hlY2soaGRjLCByYywgdVN0YXRlKTsKCiAgICBjYXNlIERGQ1NfQlVUVE9OUkFESU9JTUFHRToKICAgIGNhc2UgREZDU19CVVRUT05SQURJT01BU0s6CiAgICBjYXNlIERGQ1NfQlVUVE9OUkFESU86CiAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uUmFkaW8oaGRjLCByYywgdVN0YXRlKTsKCiAgICBkZWZhdWx0OgogICAgICAgIFdBUk4oIkludmFsaWQgYnV0dG9uIHN0YXRlPTB4JTA0eFxuIiwgdVN0YXRlKTsKICAgIH0KCiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVUlUT09MU19EcmF3RnJhbWVDYXB0aW9uCiAqCiAqIERyYXcgY2FwdGlvbiBidXR0b25zICh3aW45NSksIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKi8KCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3RnJhbWVDYXB0aW9uKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBQT0lOVCBMaW5lMVsxMF07CiAgICBQT0lOVCBMaW5lMlsxMF07CiAgICBpbnQgTGluZTFOOwogICAgaW50IExpbmUyTjsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15ciktMjsKICAgIGludCBpOwogICAgSEJSVVNIIGhic2F2ZTsKICAgIEhQRU4gaHBzYXZlOwogICAgSEZPTlQgaGZzYXZlLCBoZjsKICAgIGludCB4YyA9IChteXIubGVmdCtteXIucmlnaHQpLzI7CiAgICBpbnQgeWMgPSAobXlyLnRvcCtteXIuYm90dG9tKS8yOwogICAgaW50IGVkZ2UsIG1vdmU7CiAgICBjaGFyIHN0clsyXSA9ICI/IjsKICAgIFVJTlQgYWxpZ25zYXZlOwogICAgaW50IGJrc2F2ZTsKICAgIENPTE9SUkVGIGNscnNhdmU7CiAgICBTSVpFIHNpemU7CgogICAgVUlUT09MUzk1X0RGQ19CdXR0b25QdXNoKGRjLCByLCB1RmxhZ3MgJiAweGZmMDApOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX0NBUFRJT05DTE9TRToKICAgICAgICBlZGdlID0gMzI4KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIG1vdmUgPSA5NSpTbWFsbERpYW0vMTAwMDsKICAgICAgICBMaW5lMVswXS54ID0gTGluZTJbMF0ueCA9IExpbmUxWzFdLnggPSBMaW5lMlsxXS54ID0geGMgLSBlZGdlOwogICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMls1XS55ID0gTGluZTFbMV0ueSA9IExpbmUyWzRdLnkgPSB5YyAtIGVkZ2U7CiAgICAgICAgTGluZTFbM10ueCA9IExpbmUyWzNdLnggPSBMaW5lMVs0XS54ID0gTGluZTJbNF0ueCA9IHhjICsgZWRnZTsKICAgICAgICBMaW5lMVs1XS55ID0gTGluZTJbMl0ueSA9IExpbmUxWzRdLnkgPSBMaW5lMlsxXS55ID0geWMgKyBlZGdlOwogICAgICAgIExpbmUxWzJdLnggPSBMaW5lMlsyXS54ID0gTGluZTFbMV0ueCArIG1vdmU7CiAgICAgICAgTGluZTFbMF0ueSA9IExpbmUyWzNdLnkgPSBMaW5lMVsxXS55ICsgbW92ZTsKICAgICAgICBMaW5lMVs1XS54ID0gTGluZTJbNV0ueCA9IExpbmUxWzRdLnggLSBtb3ZlOwogICAgICAgIExpbmUxWzNdLnkgPSBMaW5lMlswXS55ID0gTGluZTFbNF0ueSAtIG1vdmU7CiAgICAgICAgTGluZTFOID0gNjsKICAgICAgICBMaW5lMk4gPSA2OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19DQVBUSU9OSEVMUDoKICAgICAgICAvKiBUaGlzIG9uZSBicmVha3MgdGhlIGZsb3cgKi8KICAgICAgICAvKiBGSVhNRTogV2UgbmVlZCB0aGUgTWFybGV0dCBmb250IGluIG9yZGVyIHRvIGdldCB0aGlzIHJpZ2h0LiAqLwoKICAgICAgICBoZiA9IENyZWF0ZUZvbnRBKC1TbWFsbERpYW0sIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgQU5TSV9DSEFSU0VULCBPVVRfREVGQVVMVF9QUkVDSVMsIENMSVBfREVGQVVMVF9QUkVDSVMsCiAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUVVBTElUWSwgRklYRURfUElUQ0h8RkZfRE9OVENBUkUsICJTeXN0ZW0iKTsKICAgICAgICBhbGlnbnNhdmUgPSBTZXRUZXh0QWxpZ24oZGMsIFRBX1RPUHxUQV9MRUZUKTsKICAgICAgICBia3NhdmUgPSBTZXRCa01vZGUoZGMsIFRSQU5TUEFSRU5UKTsKICAgICAgICBjbHJzYXZlID0gR2V0VGV4dENvbG9yKGRjKTsKICAgICAgICBoZnNhdmUgPSAoSEZPTlQpU2VsZWN0T2JqZWN0KGRjLCBoZik7CiAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MzJBKGRjLCBzdHIsIDEsICZzaXplKTsKCiAgICAgICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKICAgICAgICB7CiAgICAgICAgICAgIFNldFRleHRDb2xvcihkYywgR2V0U3lzQ29sb3IoQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgICAgIFRleHRPdXRBKGRjLCB4Yy1zaXplLmN4LzIrMSwgeWMtc2l6ZS5jeS8yKzEsIHN0ciwgMSk7CiAgICAgICAgfQogICAgICAgIFNldFRleHRDb2xvcihkYywgR2V0U3lzQ29sb3IodUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX0JUTlRFWFQpKTsKICAgICAgICBUZXh0T3V0QShkYywgeGMtc2l6ZS5jeC8yLCB5Yy1zaXplLmN5LzIsIHN0ciwgMSk7CgogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGZzYXZlKTsKICAgICAgICBTZXRUZXh0Q29sb3IoZGMsIGNscnNhdmUpOwogICAgICAgIFNldEJrTW9kZShkYywgYmtzYXZlKTsKICAgICAgICBTZXRUZXh0QWxpZ24oZGMsIGFsaWduc2F2ZSk7CiAgICAgICAgRGVsZXRlT2JqZWN0KGhmKTsKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICBjYXNlIERGQ1NfQ0FQVElPTk1JTjoKICAgICAgICBMaW5lMVswXS54ID0gTGluZTFbM10ueCA9IG15ci5sZWZ0ICAgKyAgOTYqU21hbGxEaWFtLzc1MCsyOwogICAgICAgIExpbmUxWzFdLnggPSBMaW5lMVsyXS54ID0gTGluZTFbMF0ueCArIDM3MipTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgICArIDU2MypTbWFsbERpYW0vNzUwKzE7CiAgICAgICAgTGluZTFbMl0ueSA9IExpbmUxWzNdLnkgPSBMaW5lMVswXS55ICsgIDkyKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFOID0gNDsKICAgICAgICBMaW5lMk4gPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19DQVBUSU9OTUFYOgogICAgICAgIGVkZ2UgPSA0NypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzBdLnggPSBMaW5lMVs1XS54ID0gbXlyLmxlZnQgKyAgNTcqU21hbGxEaWFtLzc1MCszOwogICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgKyAxNDMqU21hbGxEaWFtLzc1MCsxOwogICAgICAgIExpbmUxWzFdLnggPSBMaW5lMVsyXS54ID0gTGluZTFbMF0ueCArIDU2MipTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzVdLnkgPSBMaW5lMVs0XS55ID0gTGluZTFbMF0ueSArICA5MypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMVszXS55ID0gTGluZTFbMF0ueSArIDUxMypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzNdLnggPSBMaW5lMVs0XS54ID0gTGluZTFbMV0ueCAtICBlZGdlOwoKICAgICAgICBMaW5lMlswXS54ID0gTGluZTJbNV0ueCA9IExpbmUxWzBdLng7CiAgICAgICAgTGluZTJbM10ueCA9IExpbmUyWzRdLnggPSBMaW5lMVsxXS54OwogICAgICAgIExpbmUyWzFdLnggPSBMaW5lMlsyXS54ID0gTGluZTFbMF0ueCArIGVkZ2U7CiAgICAgICAgTGluZTJbMF0ueSA9IExpbmUyWzFdLnkgPSBMaW5lMVswXS55OwogICAgICAgIExpbmUyWzRdLnkgPSBMaW5lMls1XS55ID0gTGluZTFbMl0ueTsKICAgICAgICBMaW5lMlsyXS55ID0gTGluZTJbM10ueSA9IExpbmUxWzJdLnkgLSBlZGdlOwogICAgICAgIExpbmUxTiA9IDY7CiAgICAgICAgTGluZTJOID0gNjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfQ0FQVElPTlJFU1RPUkU6CiAgICAgICAgLyogRklYTUU6IHRoaXMgb25lIGxvb2tzIGJhZCBhdCBzbWFsbCBzaXplcyA8IDE1eDE1IDooICovCiAgICAgICAgZWRnZSA9IDQ3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgbW92ZSA9IDQyMCpTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzBdLnggPSBMaW5lMVs5XS54ID0gbXlyLmxlZnQgKyAxOTgqU21hbGxEaWFtLzc1MCsyOwogICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgKyAxNjkqU21hbGxEaWFtLzc1MCsxOwogICAgICAgIExpbmUxWzZdLnkgPSBMaW5lMVs3XS55ID0gTGluZTFbMF0ueSArIDkzKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbN10ueCA9IExpbmUxWzhdLnggPSBMaW5lMVswXS54ICsgZWRnZTsKICAgICAgICBMaW5lMVsxXS54ID0gTGluZTFbMl0ueCA9IExpbmUxWzBdLnggKyBtb3ZlOwogICAgICAgIExpbmUxWzVdLnggPSBMaW5lMVs2XS54ID0gTGluZTFbMV0ueCAtIGVkZ2U7CiAgICAgICAgTGluZTFbOV0ueSA9IExpbmUxWzhdLnkgPSBMaW5lMVswXS55ICsgMTg3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbMl0ueSA9IExpbmUxWzNdLnkgPSBMaW5lMVswXS55ICsgMzI3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbNF0ueSA9IExpbmUxWzVdLnkgPSBMaW5lMVsyXS55IC0gZWRnZTsKICAgICAgICBMaW5lMVszXS54ID0gTGluZTFbNF0ueCA9IExpbmUxWzJdLnggLSAxNDAqU21hbGxEaWFtLzc1MDsKCiAgICAgICAgTGluZTJbMV0ueCA9IExpbmUyWzJdLnggPSBMaW5lMVszXS54OwogICAgICAgIExpbmUyWzddLnggPSBMaW5lMls4XS54ID0gTGluZTJbMV0ueCAtIGVkZ2U7CiAgICAgICAgTGluZTJbMF0ueCA9IExpbmUyWzldLnggPSBMaW5lMlszXS54ID0gTGluZTJbNF0ueCA9IExpbmUyWzFdLnggLSBtb3ZlOwogICAgICAgIExpbmUyWzVdLnggPSBMaW5lMls2XS54ID0gTGluZTJbMF0ueCArIGVkZ2U7CiAgICAgICAgTGluZTJbMF0ueSA9IExpbmUyWzFdLnkgPSBMaW5lMVs5XS55OwogICAgICAgIExpbmUyWzRdLnkgPSBMaW5lMls1XS55ID0gTGluZTJbOF0ueSA9IExpbmUyWzldLnkgPSBMaW5lMlswXS55ICsgOTMqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMlsyXS55ID0gTGluZTJbM10ueSA9IExpbmUyWzBdLnkgKyAzMjcqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMls2XS55ID0gTGluZTJbN10ueSA9IExpbmUyWzJdLnkgLSBlZGdlOwogICAgICAgIExpbmUxTiA9IDEwOwogICAgICAgIExpbmUyTiA9IDEwOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiSW52YWxpZCBjYXB0aW9uOyBmbGFncz0weCUwNHhcbiIsIHVGbGFncyk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIEhlcmUgdGhlIGRyYXdpbmcgdGFrZXMgcGxhY2UgKi8KICAgIGlmKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpCiAgICB7CiAgICAgICAgLyogSWYgd2UgaGF2ZSBhbiBpbmFjdGl2ZSBidXR0b24sIHRoZW4geW91IHNlZSBhIHNoYWRvdyAqLwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgUG9seWdvbihkYywgTGluZTEsIExpbmUxTik7CiAgICAgICAgaWYoTGluZTJOID4gMCkKICAgICAgICAgICAgUG9seWdvbihkYywgTGluZTIsIExpbmUyTik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgIH0KCiAgICAvKiBDb3JyZWN0IGZvciB0aGUgc2hhZG93IHNoaWZ0ICovCiAgICBmb3IoaSA9IDA7IGkgPCBMaW5lMU47IGkrKykKICAgIHsKICAgICAgICBMaW5lMVtpXS54LS07CiAgICAgICAgTGluZTFbaV0ueS0tOwogICAgfQogICAgZm9yKGkgPSAwOyBpIDwgTGluZTJOOyBpKyspCiAgICB7CiAgICAgICAgTGluZTJbaV0ueC0tOwogICAgICAgIExpbmUyW2ldLnktLTsKICAgIH0KCiAgICAvKiBNYWtlIHRoZSBmaW5hbCBwaWN0dXJlICovCiAgICBpID0gdUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX0JUTlRFWFQ7CiAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChpKSk7CiAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKGkpKTsKCiAgICBQb2x5Z29uKGRjLCBMaW5lMSwgTGluZTFOKTsKICAgIGlmKExpbmUyTiA+IDApCiAgICAgICAgUG9seWdvbihkYywgTGluZTIsIExpbmUyTik7CiAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgVUlUT09MU19EcmF3RnJhbWVTY3JvbGwKICoKICogRHJhdyBhIHNjcm9sbC1iYXIgY29udHJvbCBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICovCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3RnJhbWVTY3JvbGwoSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFBPSU5UIExpbmVbNF07CiAgICBSRUNUIG15cjsKICAgIGludCBTbWFsbERpYW0gPSBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpIC0gMjsKICAgIGludCBpOwogICAgSEJSVVNIIGhic2F2ZSwgaGIsIGhiMjsKICAgIEhQRU4gaHBzYXZlLCBocCwgaHAyOwogICAgaW50IHRyaSA9IDI5MCpTbWFsbERpYW0vMTAwMCAtIDE7CiAgICBpbnQgZDQ2LCBkOTM7CgogICAgLyoKICAgICAqIFRoaXMgZml4ZXMgYSBwcm9ibGVtIHdpdGggcmVhbGx5IHRpbnkgInNjcm9sbCIgYnV0dG9ucy4gSW4gcGFydGljdWxhcgogICAgICogd2l0aCB0aGUgdXBkb3duIGNvbnRyb2wuIAogICAgICogTWFraW5nIHN1cmUgdGhhdCB0aGUgYXJyb3cgaXMgYXMgbGVhc3QgMyBwaXhlbHMgd2lkZSAob3IgaGlnaCkuCiAgICAgKi8KICAgIGlmICh0cmkgPT0gMCkKICAgICAgdHJpID0gMTsKCiAgICBzd2l0Y2godUZsYWdzICYgMHhmZikKICAgIHsKICAgIGNhc2UgREZDU19TQ1JPTExDT01CT0JPWDoKICAgIGNhc2UgREZDU19TQ1JPTExET1dOOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzJdLnkgPSBteXIudG9wICArIDY4NypTbWFsbERpYW0vMTAwMCArIDE7CiAgICAgICAgTGluZVswXS54ID0gTGluZVsyXS54IC0gdHJpOwogICAgICAgIExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzFdLnkgPSBMaW5lWzJdLnkgLSB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTFVQOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzJdLnkgPSBteXIuYm90dG9tIC0gKDY4NypTbWFsbERpYW0vMTAwMCArIDEpOwogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMl0ueCAtIHRyaTsKICAgICAgICBMaW5lWzFdLnggPSBMaW5lWzJdLnggKyB0cmk7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ID0gTGluZVsyXS55ICsgdHJpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19TQ1JPTExMRUZUOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5yaWdodCAtICg2ODcqU21hbGxEaWFtLzEwMDAgKyAxKTsKICAgICAgICBMaW5lWzJdLnkgPSBteXIudG9wICArIDQ3MCpTbWFsbERpYW0vMTAwMCArIDI7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsyXS55IC0gdHJpOwogICAgICAgIExpbmVbMV0ueSA9IExpbmVbMl0ueSArIHRyaTsKICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzFdLnggPSBMaW5lWzJdLnggKyB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTFJJR0hUOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNjg3KlNtYWxsRGlhbS8xMDAwICsgMTsKICAgICAgICBMaW5lWzJdLnkgPSBteXIudG9wICArIDQ3MCpTbWFsbERpYW0vMTAwMCArIDI7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsyXS55IC0gdHJpOwogICAgICAgIExpbmVbMV0ueSA9IExpbmVbMl0ueSArIHRyaTsKICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzFdLnggPSBMaW5lWzJdLnggLSB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTFNJWkVHUklQOgogICAgICAgIC8qIFRoaXMgb25lIGJyZWFrcyB0aGUgZmxvdy4uLiAqLwogICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsIHIsIEVER0VfQlVNUCwgQkZfTUlERExFIHwgKCh1RmxhZ3MmKERGQ1NfTU9OT3xERkNTX0ZMQVQpKSA/IEJGX01PTk8gOiAwKSk7CiAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX1BFTikpOwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7CiAgICAgICAgaWYodUZsYWdzICYgKERGQ1NfTU9OT3xERkNTX0ZMQVQpKQogICAgICAgIHsKICAgICAgICAgICAgaHAgPSBocDIgPSBHZXRTeXNDb2xvclBlbihDT0xPUl9XSU5ET1dGUkFNRSk7CiAgICAgICAgICAgIGhiID0gaGIyID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9XSU5ET1dGUkFNRSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGhwICA9IEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCk7CiAgICAgICAgICAgIGhwMiA9IEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTlNIQURPVyk7CiAgICAgICAgICAgIGhiICA9IEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlROSElHSExJR0hUKTsKICAgICAgICAgICAgaGIyID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5TSEFET1cpOwogICAgICAgIH0KICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzFdLnggPSByLT5yaWdodC0xOwogICAgICAgIExpbmVbMl0ueSA9IExpbmVbM10ueSA9IHItPmJvdHRvbS0xOwogICAgICAgIGQ0NiA9IDQ2KlNtYWxsRGlhbS83NTA7CiAgICAgICAgZDkzID0gOTMqU21hbGxEaWFtLzc1MDsKCiAgICAgICAgaSA9IDU4NipTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmVbMF0ueSA9IHItPmJvdHRvbSAtIGkgLSAxOwogICAgICAgIExpbmVbM10ueCA9IHItPnJpZ2h0IC0gaSAtIDE7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVswXS55ICsgZDQ2OwogICAgICAgIExpbmVbMl0ueCA9IExpbmVbM10ueCArIGQ0NjsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgTGluZVsxXS55Kys7IExpbmVbMl0ueCsrOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSArIGQ5MzsKICAgICAgICBMaW5lWzNdLnggPSBMaW5lWzJdLnggKyBkOTM7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYjIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHAyKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgaSA9IDM5OCpTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmVbMF0ueSA9IHItPmJvdHRvbSAtIGkgLSAxOwogICAgICAgIExpbmVbM10ueCA9IHItPnJpZ2h0IC0gaSAtIDE7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVswXS55ICsgZDQ2OwogICAgICAgIExpbmVbMl0ueCA9IExpbmVbM10ueCArIGQ0NjsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgTGluZVsxXS55Kys7IExpbmVbMl0ueCsrOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSArIGQ5MzsKICAgICAgICBMaW5lWzNdLnggPSBMaW5lWzJdLnggKyBkOTM7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYjIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHAyKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgaSA9IDIxMCpTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmVbMF0ueSA9IHItPmJvdHRvbSAtIGkgLSAxOwogICAgICAgIExpbmVbM10ueCA9IHItPnJpZ2h0IC0gaSAtIDE7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVswXS55ICsgZDQ2OwogICAgICAgIExpbmVbMl0ueCA9IExpbmVbM10ueCArIGQ0NjsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgTGluZVsxXS55Kys7IExpbmVbMl0ueCsrOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSArIGQ5MzsKICAgICAgICBMaW5lWzNdLnggPSBMaW5lWzJdLnggKyBkOTM7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYjIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHAyKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICBkZWZhdWx0OgogICAgICAgIFdBUk4oIkludmFsaWQgc2Nyb2xsOyBmbGFncz0weCUwNHhcbiIsIHVGbGFncyk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIEhlcmUgZG8gdGhlIHJlYWwgc2Nyb2xsLWJhciBjb250cm9scyBlbmQgdXAgKi8KICAgIGlmKCAhICh1RmxhZ3MgJiAoMHhmZjAwICYgfkRGQ1NfQURKVVNUUkVDVCkpICkKICAgICAgLyogVUlUT09MUzk1X0RGQ19CdXR0b25QdXNoIGFsd2F5cyB1c2VzIEJGX1NPRlQgd2hpY2ggd2UgZG9uJ3QgKi8KICAgICAgLyogd2FudCBmb3IgdGhlIG5vcm1hbCBzY3JvbGwtYXJyb3cgYnV0dG9uLiAqLwogICAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKCBkYywgciwgRURHRV9SQUlTRUQsICh1RmxhZ3MmREZDU19BREpVU1RSRUNUKSB8IEJGX01JRERMRSB8IEJGX1JFQ1QpOwogICAgZWxzZQogICAgICBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2goZGMsIHIsICh1RmxhZ3MgJiAweGZmMDApICk7CgogICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKICAgIHsKICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDMpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CgogICAgaWYoICh1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKSB8fCAhKHVGbGFncyAmIERGQ1NfUFVTSEVEKSApCiAgICAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykKICAgICAgewogICAgICAgIExpbmVbaV0ueC0tOwogICAgICAgIExpbmVbaV0ueS0tOwogICAgICB9CgogICAgaSA9IHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUgPyBDT0xPUl9CVE5TSEFET1cgOiBDT0xPUl9CVE5URVhUOwogICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihpKSk7CiAgICBQb2x5Z29uKGRjLCBMaW5lLCAzKTsKICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lTWVudQogKgogKiBEcmF3IGEgbWVudSBjb250cm9sIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKi8Kc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdGcmFtZU1lbnUoSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFBPSU5UIFBvaW50c1s2XTsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICBpbnQgaTsKICAgIEhCUlVTSCBoYnNhdmU7CiAgICBIUEVOIGhwc2F2ZTsKICAgIGludCB4ZSwgeWU7CiAgICBpbnQgeGMsIHljOwogICAgQk9PTCByZXR2YWwgPSBUUlVFOwoKICAgIC8qIFVzaW5nIGJsYWNrIGFuZCB3aGl0ZSBzZWVtcyB0byBiZSB1dHRlcmx5IHdyb25nLCBidXQgd2luOTUgZG9lc24ndCAqLwogICAgLyogdXNlIGFueXRoaW5nIGVsc2UuIEkgdGhpbmsgSSB0cmllZCBhbGwgc3lzLWNvbG9ycyB0byBjaGFuZ2UgdGhpbmdzICovCiAgICAvKiB3aXRob3V0IGx1Y2suIEl0IHNlZW1zIGFzIGlmIHRoaXMgYmVoYXZpb3IgaXMgaW5oZXJpdGVkIGZyb20gdGhlICovCiAgICAvKiB3aW4zMSBERkMoKSBpbXBsZW1lbnRhdGlvbi4uLiAoeW91IHJlbWVtYmVyLCBCL1cgbWVudXMpLiAqLwoKICAgIEZpbGxSZWN0KGRjLCByLCAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKSk7CgogICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CiAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KEJMQUNLX1BFTikpOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX01FTlVBUlJPVzoKICAgICAgICBpID0gMTg3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDQ2OCpTbWFsbERpYW0vNzUwOwogICAgICAgIFBvaW50c1syXS55ID0gbXlyLnRvcCAgKyAzNTIqU21hbGxEaWFtLzc1MCsxOwogICAgICAgIFBvaW50c1swXS55ID0gUG9pbnRzWzJdLnkgLSBpOwogICAgICAgIFBvaW50c1sxXS55ID0gUG9pbnRzWzJdLnkgKyBpOwogICAgICAgIFBvaW50c1swXS54ID0gUG9pbnRzWzFdLnggPSBQb2ludHNbMl0ueCAtIGk7CiAgICAgICAgUG9seWdvbihkYywgUG9pbnRzLCAzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfTUVOVUJVTExFVDoKICAgICAgICB4ZSA9IG15ci5sZWZ0OwogICAgICAgIHllID0gbXlyLnRvcCAgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKICAgICAgICB4YyA9IG15ci5sZWZ0ICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CiAgICAgICAgeWMgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwogICAgICAgIGkgPSAyMzQqU21hbGxEaWFtLzc1MDsKICAgICAgICBpID0gaSA8IDEgPyAxIDogaTsKICAgICAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKICAgICAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICAgICAgbXlyLnRvcCAgICA9IHljIC0gaStpLzI7CiAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwogICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19NRU5VQ0hFQ0s6CiAgICAgICAgUG9pbnRzWzBdLnggPSBteXIubGVmdCArIDI1MypTbWFsbERpYW0vMTAwMDsKICAgICAgICBQb2ludHNbMF0ueSA9IG15ci50b3AgICsgNDQ1KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIFBvaW50c1sxXS54ID0gbXlyLmxlZnQgKyA0MDkqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgUG9pbnRzWzFdLnkgPSBQb2ludHNbMF0ueSArIChQb2ludHNbMV0ueC1Qb2ludHNbMF0ueCk7CiAgICAgICAgUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDY5MCpTbWFsbERpYW0vMTAwMDsKICAgICAgICBQb2ludHNbMl0ueSA9IFBvaW50c1sxXS55IC0gKFBvaW50c1syXS54LVBvaW50c1sxXS54KTsKICAgICAgICBQb2ludHNbM10ueCA9IFBvaW50c1syXS54OwogICAgICAgIFBvaW50c1szXS55ID0gUG9pbnRzWzJdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBQb2ludHNbNF0ueCA9IFBvaW50c1sxXS54OwogICAgICAgIFBvaW50c1s0XS55ID0gUG9pbnRzWzFdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBQb2ludHNbNV0ueCA9IFBvaW50c1swXS54OwogICAgICAgIFBvaW50c1s1XS55ID0gUG9pbnRzWzBdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBQb2x5Z29uKGRjLCBQb2ludHMsIDYpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiSW52YWxpZCBtZW51OyBmbGFncz0weCUwNHhcbiIsIHVGbGFncyk7CiAgICAgICAgcmV0dmFsID0gRkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgcmV0dXJuIHJldHZhbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wxNiAgKFVTRVIuNjU2KQogKi8KQk9PTDE2IFdJTkFQSSBEcmF3RnJhbWVDb250cm9sMTYoIEhEQzE2IGhkYywgTFBSRUNUMTYgcmMsIFVJTlQxNiB1VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB1U3RhdGUgKQp7CiAgICBSRUNUIHJlY3QzMjsKICAgIEJPT0wgcmV0OwoKICAgIENPTlZfUkVDVDE2VE8zMiggcmMsICZyZWN0MzIgKTsKICAgIHJldCA9IERyYXdGcmFtZUNvbnRyb2woIGhkYywgJnJlY3QzMiwgdVR5cGUsIHVTdGF0ZSApOwogICAgQ09OVl9SRUNUMzJUTzE2KCAmcmVjdDMyLCByYyApOwogICAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wzMiAgKFVTRVIzMi4xNTgpCiAqLwpCT09MIFdJTkFQSSBEcmF3RnJhbWVDb250cm9sKCBIREMgaGRjLCBMUFJFQ1QgcmMsIFVJTlQgdVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVTdGF0ZSApCnsKICAgIC8qIFdpbjk1IGRvZXNuJ3Qgc3VwcG9ydCBkcmF3aW5nIGluIG90aGVyIG1hcHBpbmcgbW9kZXMgKi8KICAgIGlmKEdldE1hcE1vZGUoaGRjKSAhPSBNTV9URVhUKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAKICAgIHN3aXRjaCh1VHlwZSkKICAgIHsKICAgIGNhc2UgREZDX0JVVFRPTjoKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVCdXR0b24oaGRjLCByYywgdVN0YXRlKTsKICAgIGNhc2UgREZDX0NBUFRJT046CiAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd0ZyYW1lQ2FwdGlvbihoZGMsIHJjLCB1U3RhdGUpOwogICAgY2FzZSBERkNfTUVOVToKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVNZW51KGhkYywgcmMsIHVTdGF0ZSk7CiAgICBjYXNlIERGQ19TQ1JPTEw6CiAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd0ZyYW1lU2Nyb2xsKGhkYywgcmMsIHVTdGF0ZSk7CiAgICBkZWZhdWx0OgogICAgICBXQVJOKCIoJXgsJXAsJWQsJXgpLCBiYWQgdHlwZSFcbiIsCgkgICBoZGMscmMsdVR5cGUsdVN0YXRlICk7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCg==