LyoKICogVXNlciBJbnRlcmZhY2UgRnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTk3IERpbWl0cmllIE8uIFBhdW4KICogQ29weXJpZ2h0IDE5OTcgQmVydGhvIEEuIFN0dWx0aWVucwogKi8KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2luZS93aW51c2VyMTYuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgInR3ZWFrLmgiCgpERUZBVUxUX0RFQlVHX0NIQU5ORUwoZ3JhcGhpY3MpCgpzdGF0aWMgY29uc3QgV09SRCB3UGF0dGVybl9BQTU1WzhdID0geyAweGFhYWEsIDB4NTU1NSwgMHhhYWFhLCAweDU1NTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWFhYSwgMHg1NTU1LCAweGFhYWEsIDB4NTU1NSB9OwoKLyogVGhlc2UgdGFibGVzIGFyZSB1c2VkIGluOgogKiBVSVRPT0xTX0RyYXdEaWFnRWRnZSgpCiAqIFVJVE9PTFNfRHJhd1JlY3RFZGdlKCkKICovCnN0YXRpYyBjb25zdCBjaGFyIExUSW5uZXJOb3JtYWxbXSA9IHsKICAgIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgIC0xLAogICAgLTEsICAgICAgICAgICBDT0xPUl9CVE5ISUdITElHSFQsIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEsCiAgICAtMSwgICAgICAgICAgIENPTE9SXzNEREtTSEFET1csICAgQ09MT1JfM0RES1NIQURPVywgICAtMSwKICAgIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgIC0xCn07CgpzdGF0aWMgY29uc3QgY2hhciBMVE91dGVyTm9ybWFsW10gPSB7CiAgICAtMSwgICAgICAgICAgICAgICAgIENPTE9SXzNETElHSFQsICAgICBDT0xPUl9CVE5TSEFET1csIC0xLAogICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKICAgIENPTE9SXzNEREtTSEFET1csICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEsCiAgICAtMSwgICAgICAgICAgICAgICAgIENPTE9SXzNETElHSFQsICAgICBDT0xPUl9CVE5TSEFET1csIC0xCn07CgpzdGF0aWMgY29uc3QgY2hhciBSQklubmVyTm9ybWFsW10gPSB7CiAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xLAogICAgLTEsICAgICAgICAgICBDT0xPUl9CVE5TSEFET1csICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKICAgIC0xLCAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SXzNETElHSFQsICAgLTEsCiAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xCn07CgpzdGF0aWMgY29uc3QgY2hhciBSQk91dGVyTm9ybWFsW10gPSB7CiAgICAtMSwgICAgICAgICAgICAgIENPTE9SXzNEREtTSEFET1csICBDT0xPUl9CVE5ISUdITElHSFQsIC0xLAogICAgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl8zRERLU0hBRE9XLCAgQ09MT1JfQlROSElHSExJR0hULCAtMSwKICAgIENPTE9SXzNETElHSFQsICAgQ09MT1JfM0RES1NIQURPVywgIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEsCiAgICAtMSwgICAgICAgICAgICAgIENPTE9SXzNEREtTSEFET1csICBDT0xPUl9CVE5ISUdITElHSFQsIC0xCn07CgpzdGF0aWMgY29uc3QgY2hhciBMVElubmVyU29mdFtdID0gewogICAgLTEsICAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgLTEsCiAgICAtMSwgICAgICAgICAgICAgICAgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfM0RMSUdIVCwgICAtMSwKICAgIC0xLCAgICAgICAgICAgICAgICAgIENPTE9SX0JUTlNIQURPVywgICBDT0xPUl9CVE5TSEFET1csIC0xLAogICAgLTEsICAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgLTEKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUT3V0ZXJTb2Z0W10gPSB7CiAgICAtMSwgICAgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEsCiAgICBDT0xPUl8zRExJR0hULCAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEsCiAgICBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEsCiAgICAtMSwgICAgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEKfTsKCiNkZWZpbmUgUkJJbm5lclNvZnQgUkJJbm5lck5vcm1hbCAgIC8qIFRoZXNlIGFyZSB0aGUgc2FtZSAqLwojZGVmaW5lIFJCT3V0ZXJTb2Z0IFJCT3V0ZXJOb3JtYWwKCnN0YXRpYyBjb25zdCBjaGFyIExUUkJPdXRlck1vbm9bXSA9IHsKICAgIC0xLCAgICAgICAgICAgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKICAgIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKICAgIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKICAgIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUUkJJbm5lck1vbm9bXSA9IHsKICAgIC0xLCAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgLTEsCiAgICAtMSwgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywKICAgIC0xLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLAogICAgLTEsIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csCn07CgpzdGF0aWMgY29uc3QgY2hhciBMVFJCT3V0ZXJGbGF0W10gPSB7CiAgICAtMSwgICAgICAgICAgICAgICAgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKICAgIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLAogICAgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csCiAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKfTsKCnN0YXRpYyBjb25zdCBjaGFyIExUUkJJbm5lckZsYXRbXSA9IHsKICAgIC0xLCAtMSwgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgLTEsCiAgICAtMSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKICAgIC0xLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAogICAgLTEsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFVJVE9PTFNfRHJhd0RpYWdFZGdlCiAqCiAqIFNhbWUgYXMgRHJhd0VkZ2UgaW52b2tlZCB3aXRoIEJGX0RJQUdPTkFMCiAqCiAqIDAzLURlYy0xOTk3OiBDaGFuZ2VkIGJ5IEJlcnRobyBTdHVsdGllbnMKICoKICogU2VlIGFsc28gY29tbWVudHMgd2l0aCBVSVRPT0xTX0RyYXdSZWN0RWRnZSgpCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfRHJhd0RpYWdFZGdlKEhEQyBoZGMsIExQUkVDVCByYywgCgkJCQkgICAgIFVJTlQgdVR5cGUsIFVJTlQgdUZsYWdzKQp7CiAgICBQT0lOVCBQb2ludHNbNF07CiAgICBjaGFyIElubmVySSwgT3V0ZXJJOwogICAgSFBFTiBJbm5lclBlbiwgT3V0ZXJQZW47CiAgICBQT0lOVCBTYXZlUG9pbnQ7CiAgICBIUEVOIFNhdmVQZW47CiAgICBpbnQgc3B4LCBzcHk7CiAgICBpbnQgZXB4LCBlcHk7CiAgICBpbnQgV2lkdGggPSByYy0+cmlnaHQgLSByYy0+bGVmdDsKICAgIGludCBIZWlnaHQ9IHJjLT5ib3R0b20gLSByYy0+dG9wOwogICAgaW50IFNtYWxsRGlhbSA9IFdpZHRoID4gSGVpZ2h0ID8gSGVpZ2h0IDogV2lkdGg7CiAgICBCT09MIHJldHZhbCA9ICEoICAgKCh1VHlwZSAmIEJEUl9JTk5FUikgPT0gQkRSX0lOTkVSCiAgICAgICAgICAgICAgICAgICAgICAgfHwgKHVUeXBlICYgQkRSX09VVEVSKSA9PSBCRFJfT1VURVIpCiAgICAgICAgICAgICAgICAgICAgICAmJiAhKHVGbGFncyAmIChCRl9GTEFUfEJGX01PTk8pKSApOwogICAgaW50IGFkZCA9IChMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXSAhPSAtMSA/IDEgOiAwKQogICAgICAgICAgICArIChMVFJCT3V0ZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXSAhPSAtMSA/IDEgOiAwKTsKCiAgICAvKiBJbml0IHNvbWUgdmFycyAqLwogICAgT3V0ZXJQZW4gPSBJbm5lclBlbiA9IChIUEVOKUdldFN0b2NrT2JqZWN0KE5VTExfUEVOKTsKICAgIFNhdmVQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QoaGRjLCBJbm5lclBlbik7CiAgICBzcHggPSBzcHkgPSBlcHggPSBlcHkgPSAwOyAvKiBTYXRpc2Z5IHRoZSBjb21waWxlci4uLiAqLwogICAgCiAgICAvKiBEZXRlcm1pbmUgdGhlIGNvbG9ycyBvZiB0aGUgZWRnZXMgKi8KICAgIGlmKHVGbGFncyAmIEJGX01PTk8pCiAgICB7CiAgICAgICAgSW5uZXJJID0gTFRSQklubmVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgT3V0ZXJJID0gTFRSQk91dGVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICB9CiAgICBlbHNlIGlmKHVGbGFncyAmIEJGX0ZMQVQpCiAgICB7CiAgICAgICAgSW5uZXJJID0gTFRSQklubmVyRmxhdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgT3V0ZXJJID0gTFRSQk91dGVyRmxhdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICB9CiAgICBlbHNlIGlmKHVGbGFncyAmIEJGX1NPRlQpCiAgICB7CiAgICAgICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKQogICAgICAgIHsKICAgICAgICAgICAgSW5uZXJJID0gUkJJbm5lclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBSQk91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIElubmVySSA9IExUSW5uZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICAgICAgT3V0ZXJJID0gTFRPdXRlclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCiAgICAgICAgewogICAgICAgICAgICBJbm5lckkgPSBSQklubmVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICAgICAgT3V0ZXJJID0gUkJPdXRlck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIElubmVySSA9IExUSW5uZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgICAgICBPdXRlckkgPSBMVE91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICB9CiAgICB9CgogICAgaWYoSW5uZXJJICE9IC0xKSBJbm5lclBlbiA9IEdldFN5c0NvbG9yUGVuKElubmVySSk7CiAgICBpZihPdXRlckkgIT0gLTEpIE91dGVyUGVuID0gR2V0U3lzQ29sb3JQZW4oT3V0ZXJJKTsKCiAgICBNb3ZlVG9FeChoZGMsIDAsIDAsICZTYXZlUG9pbnQpOwoKICAgIC8qIERvbid0IGFzayBtZSB3aHksIGJ1dCB0aGlzIGlzIHdoYXQgaXMgdmlzaWJsZS4uLiAqLwogICAgLyogVGhpcyBtdXN0IGJlIHBvc3NpYmxlIHRvIGRvIG11Y2ggc2ltcGxlciwgYnV0IEkgZmFpbCB0byAqLwogICAgLyogc2VlIHRoZSBsb2dpYyBpbiB0aGUgTVMgaW1wbGVtZW50YXRpb24gKHNpZ2guLi4pLiAqLwogICAgLyogU28sIHRoaXMgbWlnaHQgbG9vayBhIGJpdCBicnV0ZSBmb3JjZSBoZXJlIChhbmQgaXQgaXMpLCBidXQgKi8KICAgIC8qIGl0IGdldHMgdGhlIGpvYiBkb25lOykgKi8KCiAgICBzd2l0Y2godUZsYWdzICYgQkZfUkVDVCkKICAgIHsKICAgIGNhc2UgMDoKICAgIGNhc2UgQkZfTEVGVDoKICAgIGNhc2UgQkZfQk9UVE9NOgogICAgY2FzZSBCRl9CT1RUT01MRUZUOgogICAgICAgIC8qIExlZnQgYm90dG9tIGVuZHBvaW50ICovCiAgICAgICAgZXB4ID0gcmMtPmxlZnQtMTsKICAgICAgICBzcHggPSBlcHggKyBTbWFsbERpYW07CiAgICAgICAgZXB5ID0gcmMtPmJvdHRvbTsKICAgICAgICBzcHkgPSBlcHkgLSBTbWFsbERpYW07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBCRl9UT1BMRUZUOgogICAgY2FzZSBCRl9CT1RUT01SSUdIVDoKICAgICAgICAvKiBMZWZ0IHRvcCBlbmRwb2ludCAqLwogICAgICAgIGVweCA9IHJjLT5sZWZ0LTE7CiAgICAgICAgc3B4ID0gZXB4ICsgU21hbGxEaWFtOwogICAgICAgIGVweSA9IHJjLT50b3AtMTsKICAgICAgICBzcHkgPSBlcHkgKyBTbWFsbERpYW07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBCRl9UT1A6CiAgICBjYXNlIEJGX1JJR0hUOgogICAgY2FzZSBCRl9UT1BSSUdIVDoKICAgIGNhc2UgQkZfUklHSFR8QkZfTEVGVDoKICAgIGNhc2UgQkZfUklHSFR8QkZfTEVGVHxCRl9UT1A6CiAgICBjYXNlIEJGX0JPVFRPTXxCRl9UT1A6CiAgICBjYXNlIEJGX0JPVFRPTXxCRl9UT1B8QkZfTEVGVDoKICAgIGNhc2UgQkZfQk9UVE9NUklHSFR8QkZfTEVGVDoKICAgIGNhc2UgQkZfQk9UVE9NUklHSFR8QkZfVE9QOgogICAgY2FzZSBCRl9SRUNUOgogICAgICAgIC8qIFJpZ2h0IHRvcCBlbmRwb2ludCAqLwogICAgICAgIHNweCA9IHJjLT5sZWZ0OwogICAgICAgIGVweCA9IHNweCArIFNtYWxsRGlhbTsKICAgICAgICBzcHkgPSByYy0+Ym90dG9tLTE7CiAgICAgICAgZXB5ID0gc3B5IC0gU21hbGxEaWFtOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIE1vdmVUb0V4KGhkYywgc3B4LCBzcHksIE5VTEwpOwogICAgU2VsZWN0T2JqZWN0KGhkYywgT3V0ZXJQZW4pOwogICAgTGluZVRvKGhkYywgZXB4LCBlcHkpOwoKICAgIFNlbGVjdE9iamVjdChoZGMsIElubmVyUGVuKTsKCiAgICBzd2l0Y2godUZsYWdzICYgKEJGX1JFQ1R8QkZfRElBR09OQUwpKQogICAgewogICAgY2FzZSBCRl9ESUFHT05BTF9FTkRCT1RUT01MRUZUOgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfQk9UVE9NKToKICAgIGNhc2UgQkZfRElBR09OQUw6CiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9MRUZUKToKICAgICAgICBNb3ZlVG9FeChoZGMsIHNweC0xLCBzcHksIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIGVweCwgZXB5LTEpOwogICAgICAgIFBvaW50c1swXS54ID0gc3B4LWFkZDsKICAgICAgICBQb2ludHNbMF0ueSA9IHNweTsKICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5sZWZ0OwogICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKICAgICAgICBQb2ludHNbMl0ueCA9IGVweCsxOwogICAgICAgIFBvaW50c1syXS55ID0gZXB5LTEtYWRkOwogICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEJGX0RJQUdPTkFMX0VOREJPVFRPTVJJR0hUOgogICAgICAgIE1vdmVUb0V4KGhkYywgc3B4LTEsIHNweSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgZXB4LCBlcHkrMSk7CiAgICAgICAgUG9pbnRzWzBdLnggPSBzcHgtYWRkOwogICAgICAgIFBvaW50c1swXS55ID0gc3B5OwogICAgICAgIFBvaW50c1sxXS54ID0gcmMtPmxlZnQ7CiAgICAgICAgUG9pbnRzWzFdLnkgPSByYy0+Ym90dG9tLTE7CiAgICAgICAgUG9pbnRzWzJdLnggPSBlcHgrMTsKICAgICAgICBQb2ludHNbMl0ueSA9IGVweSsxK2FkZDsKICAgICAgICBQb2ludHNbM10gPSBQb2ludHNbMl07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAoQkZfRElBR09OQUx8QkZfQk9UVE9NfEJGX1JJR0hUfEJGX1RPUCk6CiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT018QkZfUklHSFR8QkZfVE9QfEJGX0xFRlQpOgogICAgY2FzZSBCRl9ESUFHT05BTF9FTkRUT1BSSUdIVDoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUfEJGX1RPUHxCRl9MRUZUKToKICAgICAgICBNb3ZlVG9FeChoZGMsIHNweCsxLCBzcHksIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIGVweCwgZXB5KzEpOwogICAgICAgIFBvaW50c1swXS54ID0gZXB4LTE7CiAgICAgICAgUG9pbnRzWzBdLnkgPSBlcHkrMSthZGQ7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3ArYWRkOwogICAgICAgIFBvaW50c1syXS54ID0gcmMtPnJpZ2h0LTE7CiAgICAgICAgUG9pbnRzWzJdLnkgPSByYy0+Ym90dG9tLTE7CiAgICAgICAgUG9pbnRzWzNdLnggPSBzcHgrYWRkOwogICAgICAgIFBvaW50c1szXS55ID0gc3B5OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQkZfRElBR09OQUxfRU5EVE9QTEVGVDoKICAgICAgICBNb3ZlVG9FeChoZGMsIHNweCwgc3B5LTEsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIGVweCsxLCBlcHkpOwogICAgICAgIFBvaW50c1swXS54ID0gZXB4KzErYWRkOwogICAgICAgIFBvaW50c1swXS55ID0gZXB5KzE7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3A7CiAgICAgICAgUG9pbnRzWzJdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMl0ueSA9IHJjLT5ib3R0b20tMS1hZGQ7CiAgICAgICAgUG9pbnRzWzNdLnggPSBzcHg7CiAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHktYWRkOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1RPUCk6CiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT018QkZfVE9QKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTXxCRl9UT1B8QkZfTEVGVCk6CiAgICAgICAgTW92ZVRvRXgoaGRjLCBzcHgrMSwgc3B5LTEsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIGVweCwgZXB5KTsKICAgICAgICBQb2ludHNbMF0ueCA9IGVweC0xOwogICAgICAgIFBvaW50c1swXS55ID0gZXB5KzE7CiAgICAgICAgUG9pbnRzWzFdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3A7CiAgICAgICAgUG9pbnRzWzJdLnggPSByYy0+cmlnaHQtMTsKICAgICAgICBQb2ludHNbMl0ueSA9IHJjLT5ib3R0b20tMS1hZGQ7CiAgICAgICAgUG9pbnRzWzNdLnggPSBzcHgrYWRkOwogICAgICAgIFBvaW50c1szXS55ID0gc3B5LWFkZDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9SSUdIVCk6CiAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9SSUdIVHxCRl9MRUZUKToKICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUfEJGX0xFRlR8QkZfQk9UVE9NKToKICAgICAgICBNb3ZlVG9FeChoZGMsIHNweCwgc3B5LCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBlcHgtMSwgZXB5KzEpOwogICAgICAgIFBvaW50c1swXS54ID0gc3B4OwogICAgICAgIFBvaW50c1swXS55ID0gc3B5OwogICAgICAgIFBvaW50c1sxXS54ID0gcmMtPmxlZnQ7CiAgICAgICAgUG9pbnRzWzFdLnkgPSByYy0+dG9wK2FkZDsKICAgICAgICBQb2ludHNbMl0ueCA9IGVweC0xLWFkZDsKICAgICAgICBQb2ludHNbMl0ueSA9IGVweSsxK2FkZDsKICAgICAgICBQb2ludHNbM10gPSBQb2ludHNbMl07CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogRmlsbCB0aGUgaW50ZXJpb3IgaWYgYXNrZWQgKi8KICAgIGlmKCh1RmxhZ3MgJiBCRl9NSURETEUpICYmIHJldHZhbCkKICAgIHsKICAgICAgICBIQlJVU0ggaGJzYXZlOwogICAgICAgIEhCUlVTSCBoYiA9IEdldFN5c0NvbG9yQnJ1c2godUZsYWdzICYgQkZfTU9OTyA/IENPTE9SX1dJTkRPVwoJCQkJCSA6Q09MT1JfQlRORkFDRSk7CiAgICAgICAgSFBFTiBocHNhdmU7CiAgICAgICAgSFBFTiBocCA9IEdldFN5c0NvbG9yUGVuKHVGbGFncyAmIEJGX01PTk8gPyBDT0xPUl9XSU5ET1cKCQkJCSAgICAgOiBDT0xPUl9CVE5GQUNFKTsKICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChoZGMsIGhiKTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoaGRjLCBocCk7CiAgICAgICAgUG9seWdvbihoZGMsIFBvaW50cywgNCk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGhkYywgaGJzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoaGRjLCBocHNhdmUpOwogICAgfQoKICAgIC8qIEFkanVzdCByZWN0YW5nbGUgaWYgYXNrZWQgKi8KICAgIGlmKHVGbGFncyAmIEJGX0FESlVTVCkKICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9MRUZUKSAgIHJjLT5sZWZ0ICAgKz0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX1JJR0hUKSAgcmMtPnJpZ2h0ICAtPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfVE9QKSAgICByYy0+dG9wICAgICs9IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pIHJjLT5ib3R0b20gLT0gYWRkOwogICAgfQoKICAgIC8qIENsZWFudXAgKi8KICAgIFNlbGVjdE9iamVjdChoZGMsIFNhdmVQZW4pOwogICAgTW92ZVRvRXgoaGRjLCBTYXZlUG9pbnQueCwgU2F2ZVBvaW50LnksIE5VTEwpOwoKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVUlUT09MU19EcmF3UmVjdEVkZ2UKICoKICogU2FtZSBhcyBEcmF3RWRnZSBpbnZva2VkIHdpdGhvdXQgQkZfRElBR09OQUwKICoKICogMjMtTm92LTE5OTc6IENoYW5nZWQgYnkgQmVydGhvIFN0dWx0aWVucwogKgogKiBXZWxsLCBJIHN0YXJ0ZWQgdGVzdGluZyB0aGlzIGFuZCBmb3VuZCBvdXQgdGhhdCB0aGVyZSBhcmUgYSBmZXcgdGhpbmdzCiAqIHRoYXQgd2VyZW4ndCBxdWl0ZSBhcyB3aW45NS4gVGhlIGZvbGxvd2luZyByZXdyaXRlIHNob3VsZCByZXByb2R1Y2UKICogd2luOTUgcmVzdWx0cyBjb21wbGV0ZWx5LgogKiBUaGUgY29sb3JzZWxlY3Rpb24gaXMgdGFibGUtZHJpdmVuIHRvIGF2b2lkIGF3ZnVsbCBpZi1zdGF0ZW1lbnRzLgogKiBUaGUgdGFibGUgYmVsb3cgc2hvdyB0aGUgY29sb3Igc2V0dGluZ3MuCiAqCiAqIFBlbiBzZWxlY3Rpb24gdGFibGUgZm9yIHVGbGFncyA9IDAKICoKICogdVR5cGUgfCAgTFRJICB8ICBMVE8gIHwgIFJCSSAgfCAgUkJPCiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAwMDAwIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqICAwMDAxIHwgICB4ICAgfCAgMjIgICB8ICAgeCAgIHwgIDIxCiAqICAwMDEwIHwgICB4ICAgfCAgMTYgICB8ICAgeCAgIHwgIDIwCiAqICAwMDExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAwMTAwIHwgICB4ICAgfCAgMjAgICB8ICAgeCAgIHwgIDE2CiAqICAwMTAxIHwgIDIwICAgfCAgMjIgICB8ICAxNiAgIHwgIDIxCiAqICAwMTEwIHwgIDIwICAgfCAgMTYgICB8ICAxNiAgIHwgIDIwCiAqICAwMTExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAxMDAwIHwgICB4ICAgfCAgMjEgICB8ICAgeCAgIHwgIDIyCiAqICAxMDAxIHwgIDIxICAgfCAgMjIgICB8ICAyMiAgIHwgIDIxCiAqICAxMDEwIHwgIDIxICAgfCAgMTYgICB8ICAyMiAgIHwgIDIwCiAqICAxMDExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAxMTAwIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqICAxMTAxIHwgICB4ICAgfCB4ICgyMil8ICAgeCAgIHwgeCAoMjEpCiAqICAxMTEwIHwgICB4ICAgfCB4ICgxNil8ICAgeCAgIHwgeCAoMjApCiAqICAxMTExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqCiAqIFBlbiBzZWxlY3Rpb24gdGFibGUgZm9yIHVGbGFncyA9IEJGX1NPRlQKICoKICogdVR5cGUgfCAgTFRJICB8ICBMVE8gIHwgIFJCSSAgfCAgUkJPCiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAwMDAwIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqICAwMDAxIHwgICB4ICAgfCAgMjAgICB8ICAgeCAgIHwgIDIxCiAqICAwMDEwIHwgICB4ICAgfCAgMjEgICB8ICAgeCAgIHwgIDIwCiAqICAwMDExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAwMTAwIHwgICB4ICAgfCAgMjIgICB8ICAgeCAgIHwgIDE2CiAqICAwMTAxIHwgIDIyICAgfCAgMjAgICB8ICAxNiAgIHwgIDIxCiAqICAwMTEwIHwgIDIyICAgfCAgMjEgICB8ICAxNiAgIHwgIDIwCiAqICAwMTExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAxMDAwIHwgICB4ICAgfCAgMTYgICB8ICAgeCAgIHwgIDIyCiAqICAxMDAxIHwgIDE2ICAgfCAgMjAgICB8ICAyMiAgIHwgIDIxCiAqICAxMDEwIHwgIDE2ICAgfCAgMjEgICB8ICAyMiAgIHwgIDIwCiAqICAxMDExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCiAqICAxMTAwIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqICAxMTAxIHwgICB4ICAgfCB4ICgyMCl8ICAgeCAgIHwgeCAoMjEpCiAqICAxMTEwIHwgICB4ICAgfCB4ICgyMSl8ICAgeCAgIHwgeCAoMjApCiAqICAxMTExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CiAqCiAqIHggPSBkb24ndCBjYXJlOyAobikgPSBpcyB3aGF0IHdpbjk1IGFjdHVhbGx5IHVzZXMKICogTFRJID0gbGVmdCBUb3AgSW5uZXIgbGluZQogKiBMVE8gPSBsZWZ0IFRvcCBPdXRlciBsaW5lCiAqIFJCSSA9IFJpZ2h0IEJvdHRvbSBJbm5lciBsaW5lCiAqIFJCTyA9IFJpZ2h0IEJvdHRvbSBPdXRlciBsaW5lCiAqIDE1ID0gQ09MT1JfQlRORkFDRQogKiAxNiA9IENPTE9SX0JUTlNIQURPVwogKiAyMCA9IENPTE9SX0JUTkhJR0hMSUdIVAogKiAyMSA9IENPTE9SXzNEREtTSEFET1cKICogMjIgPSBDT0xPUl8zRExJR0hUCiAqLwoKCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoSERDIGhkYywgTFBSRUNUIHJjLCAKCQkJCSAgICAgVUlOVCB1VHlwZSwgVUlOVCB1RmxhZ3MpCnsKICAgIGNoYXIgTFRJbm5lckksIExUT3V0ZXJJOwogICAgY2hhciBSQklubmVySSwgUkJPdXRlckk7CiAgICBIUEVOIExUSW5uZXJQZW4sIExUT3V0ZXJQZW47CiAgICBIUEVOIFJCSW5uZXJQZW4sIFJCT3V0ZXJQZW47CiAgICBSRUNUIElubmVyUmVjdCA9ICpyYzsKICAgIFBPSU5UIFNhdmVQb2ludDsKICAgIEhQRU4gU2F2ZVBlbjsKICAgIGludCBMQnBlbnBsdXMgPSAwOwogICAgaW50IExUcGVucGx1cyA9IDA7CiAgICBpbnQgUlRwZW5wbHVzID0gMDsKICAgIGludCBSQnBlbnBsdXMgPSAwOwogICAgQk9PTCByZXR2YWwgPSAhKCAgICgodVR5cGUgJiBCRFJfSU5ORVIpID09IEJEUl9JTk5FUgogICAgICAgICAgICAgICAgICAgICAgIHx8ICh1VHlwZSAmIEJEUl9PVVRFUikgPT0gQkRSX09VVEVSKQogICAgICAgICAgICAgICAgICAgICAgJiYgISh1RmxhZ3MgJiAoQkZfRkxBVHxCRl9NT05PKSkgKTsKICAgICAgICAKICAgIC8qIEluaXQgc29tZSB2YXJzICovCiAgICBMVElubmVyUGVuID0gTFRPdXRlclBlbiA9IFJCSW5uZXJQZW4gPSBSQk91dGVyUGVuID0gKEhQRU4pR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pOwogICAgU2F2ZVBlbiA9IChIUEVOKVNlbGVjdE9iamVjdChoZGMsIExUSW5uZXJQZW4pOwoKICAgIC8qIERldGVybWluZSB0aGUgY29sb3JzIG9mIHRoZSBlZGdlcyAqLwogICAgaWYodUZsYWdzICYgQkZfTU9OTykKICAgIHsKICAgICAgICBMVElubmVySSA9IFJCSW5uZXJJID0gTFRSQklubmVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgTFRPdXRlckkgPSBSQk91dGVySSA9IExUUkJPdXRlck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgfQogICAgZWxzZSBpZih1RmxhZ3MgJiBCRl9GTEFUKQogICAgewogICAgICAgIExUSW5uZXJJID0gUkJJbm5lckkgPSBMVFJCSW5uZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBMVE91dGVySSA9IFJCT3V0ZXJJID0gTFRSQk91dGVyRmxhdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CgogICAgICAgIC8qIEJlcnRobyBTdHVsdGllbnMgc3RhdGVzIGFib3ZlIHRoYXQgdGhpcyBmdW5jdGlvbiBleGFjdGx5IG1hdGNoZXMgd2luOTUKICAgICAgICAgKiBJbiB3aW45OCBCRl9GTEFUIHJlY3RhbmdlbHMgaGF2ZSBhbiBpbm5lciBib3JkZXIgc2FtZSBjb2xvciBhcyB0aGUKCSAqIG1pZGRsZSAoQ09MT1JfQlRORkFDRSkuIEkgYmVsaWV2ZSBpdCdzIHRoZSBzYW1lIGZvciB3aW45NSBidXQgc2luY2UKCSAqIEkgZG9uJ3Qga25vdyBJIGdvIHdpdGggQmVydGhvIGFuZCBqdXN0IHNldHMgaXQgZm9yIHdpbjk4IHVudGlsIHByb3ZlbgoJICogb3RoZXJ3aXNlLgoJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5uaXMgQmr2cmtsdW5kLCAxMCBKdW5lLCA5OQoJICovCglpZiggVFdFQUtfV2luZUxvb2sgPT0gV0lOOThfTE9PSyAmJiBMVElubmVySSAhPSAtMSApCSAgCiAgICAgICAgICAgIExUSW5uZXJJID0gUkJJbm5lckkgPSBDT0xPUl9CVE5GQUNFOwogICAgfQogICAgZWxzZSBpZih1RmxhZ3MgJiBCRl9TT0ZUKQogICAgewogICAgICAgIExUSW5uZXJJID0gTFRJbm5lclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIExUT3V0ZXJJID0gTFRPdXRlclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIFJCSW5uZXJJID0gUkJJbm5lclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIFJCT3V0ZXJJID0gUkJPdXRlclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIExUSW5uZXJJID0gTFRJbm5lck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgICAgTFRPdXRlckkgPSBMVE91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKICAgICAgICBSQklubmVySSA9IFJCSW5uZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgICAgIFJCT3V0ZXJJID0gUkJPdXRlck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICB9CgogICAgaWYoKHVGbGFncyAmIEJGX0JPVFRPTUxFRlQpID09IEJGX0JPVFRPTUxFRlQpICAgTEJwZW5wbHVzID0gMTsKICAgIGlmKCh1RmxhZ3MgJiBCRl9UT1BSSUdIVCkgPT0gQkZfVE9QUklHSFQpICAgICAgIFJUcGVucGx1cyA9IDE7CiAgICBpZigodUZsYWdzICYgQkZfQk9UVE9NUklHSFQpID09IEJGX0JPVFRPTVJJR0hUKSBSQnBlbnBsdXMgPSAxOwogICAgaWYoKHVGbGFncyAmIEJGX1RPUExFRlQpID09IEJGX1RPUExFRlQpICAgICAgICAgTFRwZW5wbHVzID0gMTsKCiAgICBpZihMVElubmVySSAhPSAtMSkgTFRJbm5lclBlbiA9IEdldFN5c0NvbG9yUGVuKExUSW5uZXJJKTsKICAgIGlmKExUT3V0ZXJJICE9IC0xKSBMVE91dGVyUGVuID0gR2V0U3lzQ29sb3JQZW4oTFRPdXRlckkpOwogICAgaWYoUkJJbm5lckkgIT0gLTEpIFJCSW5uZXJQZW4gPSBHZXRTeXNDb2xvclBlbihSQklubmVySSk7CiAgICBpZihSQk91dGVySSAhPSAtMSkgUkJPdXRlclBlbiA9IEdldFN5c0NvbG9yUGVuKFJCT3V0ZXJJKTsKCiAgICBNb3ZlVG9FeChoZGMsIDAsIDAsICZTYXZlUG9pbnQpOwoKICAgIC8qIERyYXcgdGhlIG91dGVyIGVkZ2UgKi8KICAgIFNlbGVjdE9iamVjdChoZGMsIExUT3V0ZXJQZW4pOwogICAgaWYodUZsYWdzICYgQkZfVE9QKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LmxlZnQsIElubmVyUmVjdC50b3AsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5yaWdodCwgSW5uZXJSZWN0LnRvcCk7CiAgICB9CiAgICBpZih1RmxhZ3MgJiBCRl9MRUZUKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LmxlZnQsIElubmVyUmVjdC50b3AsIE5VTEwpOwogICAgICAgIExpbmVUbyhoZGMsIElubmVyUmVjdC5sZWZ0LCBJbm5lclJlY3QuYm90dG9tKTsKICAgIH0KICAgIFNlbGVjdE9iamVjdChoZGMsIFJCT3V0ZXJQZW4pOwogICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LnJpZ2h0LTEsIElubmVyUmVjdC5ib3R0b20tMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LmxlZnQtMSwgSW5uZXJSZWN0LmJvdHRvbS0xKTsKICAgIH0KICAgIGlmKHVGbGFncyAmIEJGX1JJR0hUKQogICAgewogICAgICAgIE1vdmVUb0V4KGhkYywgSW5uZXJSZWN0LnJpZ2h0LTEsIElubmVyUmVjdC5ib3R0b20tMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LnJpZ2h0LTEsIElubmVyUmVjdC50b3AtMSk7CiAgICB9CgogICAgLyogRHJhdyB0aGUgaW5uZXIgZWRnZSAqLwogICAgU2VsZWN0T2JqZWN0KGhkYywgTFRJbm5lclBlbik7CiAgICBpZih1RmxhZ3MgJiBCRl9UT1ApCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QubGVmdCtMVHBlbnBsdXMsIElubmVyUmVjdC50b3ArMSwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LnJpZ2h0LVJUcGVucGx1cywgSW5uZXJSZWN0LnRvcCsxKTsKICAgIH0KICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QubGVmdCsxLCBJbm5lclJlY3QudG9wK0xUcGVucGx1cywgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LmxlZnQrMSwgSW5uZXJSZWN0LmJvdHRvbS1MQnBlbnBsdXMpOwogICAgfQogICAgU2VsZWN0T2JqZWN0KGhkYywgUkJJbm5lclBlbik7CiAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCiAgICB7CiAgICAgICAgTW92ZVRvRXgoaGRjLCBJbm5lclJlY3QucmlnaHQtMS1SQnBlbnBsdXMsIElubmVyUmVjdC5ib3R0b20tMiwgTlVMTCk7CiAgICAgICAgTGluZVRvKGhkYywgSW5uZXJSZWN0LmxlZnQtMStMQnBlbnBsdXMsIElubmVyUmVjdC5ib3R0b20tMik7CiAgICB9CiAgICBpZih1RmxhZ3MgJiBCRl9SSUdIVCkKICAgIHsKICAgICAgICBNb3ZlVG9FeChoZGMsIElubmVyUmVjdC5yaWdodC0yLCBJbm5lclJlY3QuYm90dG9tLTEtUkJwZW5wbHVzLCBOVUxMKTsKICAgICAgICBMaW5lVG8oaGRjLCBJbm5lclJlY3QucmlnaHQtMiwgSW5uZXJSZWN0LnRvcC0xK1JUcGVucGx1cyk7CiAgICB9CgogICAgaWYoICgodUZsYWdzICYgQkZfTUlERExFKSAmJiByZXR2YWwpIHx8ICh1RmxhZ3MgJiBCRl9BREpVU1QpICkKICAgIHsKICAgICAgICBpbnQgYWRkID0gKExUUkJJbm5lck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildICE9IC0xID8gMSA6IDApCiAgICAgICAgICAgICAgICArIChMVFJCT3V0ZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXSAhPSAtMSA/IDEgOiAwKTsKCiAgICAgICAgaWYodUZsYWdzICYgQkZfTEVGVCkgICBJbm5lclJlY3QubGVmdCAgICs9IGFkZDsKICAgICAgICBpZih1RmxhZ3MgJiBCRl9SSUdIVCkgIElubmVyUmVjdC5yaWdodCAgLT0gYWRkOwogICAgICAgIGlmKHVGbGFncyAmIEJGX1RPUCkgICAgSW5uZXJSZWN0LnRvcCAgICArPSBhZGQ7CiAgICAgICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKSBJbm5lclJlY3QuYm90dG9tIC09IGFkZDsKCiAgICAgICAgaWYoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKQoJeyAKICAgICAgICAgICAgRmlsbFJlY3QoaGRjLCAmSW5uZXJSZWN0LCBHZXRTeXNDb2xvckJydXNoKHVGbGFncyAmIEJGX01PTk8gPyAKCQkJCQkJICAgICAgIENPTE9SX1dJTkRPVyA6IENPTE9SX0JUTkZBQ0UpKTsKCX0KCglpZih1RmxhZ3MgJiBCRl9BREpVU1QpCgkgICAgKnJjID0gSW5uZXJSZWN0OwogICAgfQoKICAgIC8qIENsZWFudXAgKi8KICAgIFNlbGVjdE9iamVjdChoZGMsIFNhdmVQZW4pOwogICAgTW92ZVRvRXgoaGRjLCBTYXZlUG9pbnQueCwgU2F2ZVBvaW50LnksIE5VTEwpOwogICAgcmV0dXJuIHJldHZhbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdFZGdlMTYgICAoVVNFUi42NTkpCiAqLwpCT09MMTYgV0lOQVBJIERyYXdFZGdlMTYoIEhEQzE2IGhkYywgTFBSRUNUMTYgcmMsIFVJTlQxNiBlZGdlLCBVSU5UMTYgZmxhZ3MgKQp7CiAgICBSRUNUIHJlY3QzMjsKICAgIEJPT0wgcmV0OwoKICAgIENPTlZfUkVDVDE2VE8zMiggcmMsICZyZWN0MzIgKTsKICAgIHJldCA9IERyYXdFZGdlKCBoZGMsICZyZWN0MzIsIGVkZ2UsIGZsYWdzICk7CiAgICBDT05WX1JFQ1QzMlRPMTYoICZyZWN0MzIsIHJjICk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICBEcmF3RWRnZTMyICAgKFVTRVIzMi4xNTUpCiAqLwpCT09MIFdJTkFQSSBEcmF3RWRnZSggSERDIGhkYywgTFBSRUNUIHJjLCBVSU5UIGVkZ2UsIFVJTlQgZmxhZ3MgKQp7CiAgICBUUkFDRSgiJTA0eCAlZCwlZC0lZCwlZCAlMDR4ICUwNHhcbiIsCgkgIGhkYywgcmMtPmxlZnQsIHJjLT50b3AsIHJjLT5yaWdodCwgcmMtPmJvdHRvbSwgZWRnZSwgZmxhZ3MgKTsKCiAgICBpZihmbGFncyAmIEJGX0RJQUdPTkFMKQogICAgICByZXR1cm4gVUlUT09MUzk1X0RyYXdEaWFnRWRnZShoZGMsIHJjLCBlZGdlLCBmbGFncyk7CiAgICBlbHNlCiAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKGhkYywgcmMsIGVkZ2UsIGZsYWdzKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVUlUT09MU19NYWtlU3F1YXJlUmVjdAogKgogKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIHNxdWFyZSByZWN0YW5nbGUgYW5kIHJldHVybmluZyB0aGUgd2lkdGgKICovCnN0YXRpYyBpbnQgVUlUT09MU19NYWtlU3F1YXJlUmVjdChMUFJFQ1Qgc3JjLCBMUFJFQ1QgZHN0KQp7CiAgICBpbnQgV2lkdGggID0gc3JjLT5yaWdodCAtIHNyYy0+bGVmdDsKICAgIGludCBIZWlnaHQgPSBzcmMtPmJvdHRvbSAtIHNyYy0+dG9wOwogICAgaW50IFNtYWxsRGlhbSA9IFdpZHRoID4gSGVpZ2h0ID8gSGVpZ2h0IDogV2lkdGg7CgogICAgKmRzdCA9ICpzcmM7CgogICAgLyogTWFrZSBpdCBhIHNxdWFyZSBib3ggKi8KICAgIGlmKFdpZHRoIDwgSGVpZ2h0KSAgICAgIC8qIFNtYWxsRGlhbSA9PSBXaWR0aCAqLwogICAgewogICAgICAgIGRzdC0+dG9wICs9IChIZWlnaHQtV2lkdGgpLzI7CiAgICAgICAgZHN0LT5ib3R0b20gPSBkc3QtPnRvcCArIFNtYWxsRGlhbTsKICAgIH0KICAgIGVsc2UgaWYoV2lkdGggPiBIZWlnaHQpIC8qIFNtYWxsRGlhbSA9PSBIZWlnaHQgKi8KICAgIHsKICAgICAgICBkc3QtPmxlZnQgKz0gKFdpZHRoLUhlaWdodCkvMjsKICAgICAgICBkc3QtPnJpZ2h0ID0gZHN0LT5sZWZ0ICsgU21hbGxEaWFtOwogICAgfQoKICAgcmV0dXJuIFNtYWxsRGlhbTsKfQoKc3RhdGljIHZvaWQgVUlUT09MU19EcmF3Q2hlY2tlZFJlY3QoIEhEQyBkYywgTFBSRUNUIHJlY3QgKQp7CiAgICBpZihHZXRTeXNDb2xvcihDT0xPUl9CVE5ISUdITElHSFQpID09IFJHQigyNTUsIDI1NSwgMjU1KSkKICAgIHsKICAgICAgSEJJVE1BUCBoYm0gPSBDcmVhdGVCaXRtYXAoOCwgOCwgMSwgMSwgd1BhdHRlcm5fQUE1NSk7CiAgICAgIEhCUlVTSCBoYnNhdmU7CiAgICAgIEhCUlVTSCBoYiA9IENyZWF0ZVBhdHRlcm5CcnVzaChoYm0pOwogICAgICBDT0xPUlJFRiBiZzsKCiAgICAgIEZpbGxSZWN0KGRjLCByZWN0LCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkZBQ0UpKTsKICAgICAgYmcgPSBTZXRCa0NvbG9yKGRjLCBSR0IoMjU1LCAyNTUsIDI1NSkpOwogICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgaGIpOwogICAgICBQYXRCbHQoZGMsIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQtcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tLXJlY3QtPnRvcCwgMHgwMEZBMDA4OSk7CiAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgU2V0QmtDb2xvcihkYywgYmcpOwogICAgICBEZWxldGVPYmplY3QoaGIpOwogICAgICBEZWxldGVPYmplY3QoaGJtKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBGaWxsUmVjdChkYywgcmVjdCwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKglVSVRPT0xTX0RGQ19CdXR0b25QdXNoCiAqCiAqIERyYXcgYSBwdXNoIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICoKICogRG9lcyBhIHByZXR0eSBnb29kIGpvYiBpbiBlbXVsYXRpbmcgTVMgYmVoYXZpb3IuIFNvbWUgcXVpcmtzIGFyZQogKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKICogdGhlIGJ1dHRvbnMuCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2goSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFVJTlQgZWRnZTsKICAgIFJFQ1QgbXlyID0gKnI7CgogICAgaWYodUZsYWdzICYgKERGQ1NfUFVTSEVEIHwgREZDU19DSEVDS0VEIHwgREZDU19GTEFUKSkKICAgICAgICBlZGdlID0gRURHRV9TVU5LRU47CiAgICBlbHNlCiAgICAgICAgZWRnZSA9IEVER0VfUkFJU0VEOwoKICAgIGlmKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkKICAgIHsKICAgICAgICBpZih1RmxhZ3MgJiBERkNTX01PTk8pCiAgICAgICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsICZteXIsIGVkZ2UsIEJGX01PTk98QkZfUkVDVHxCRl9BREpVU1QpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpfEJGX1JFQ1R8QkZfU09GVHxCRl9BREpVU1QpOwoKCVVJVE9PTFNfRHJhd0NoZWNrZWRSZWN0KCBkYywgJm15ciApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgIGlmKHVGbGFncyAmIERGQ1NfTU9OTykKICAgICAgICB7CiAgICAgICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsICZteXIsIGVkZ2UsIEJGX01PTk98QkZfUkVDVHxCRl9BREpVU1QpOwogICAgICAgICAgICBGaWxsUmVjdChkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5GQUNFKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsIHIsIGVkZ2UsICh1RmxhZ3MmREZDU19GTEFUKSB8IEJGX01JRERMRSB8QkZfU09GVHwgQkZfUkVDVCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIEFkanVzdCByZWN0YW5nbGUgaWYgYXNrZWQgKi8KICAgIGlmKHVGbGFncyAmIERGQ1NfQURKVVNUUkVDVCkKICAgIHsKICAgICAgICByLT5sZWZ0ICAgKz0gMjsKICAgICAgICByLT5yaWdodCAgLT0gMjsKICAgICAgICByLT50b3AgICAgKz0gMjsKICAgICAgICByLT5ib3R0b20gLT0gMjsKICAgIH0KCiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVUlUT09MU19ERkNfQnV0dG9uQ2hjZWsKICoKICogRHJhdyBhIGNoZWNrLzNzdGF0ZSBidXR0b24gY29taW5nIGZyb20gRHJhd0ZyYW1lQ29udHJvbCgpCiAqCiAqIERvZXMgYSBwcmV0dHkgZ29vZCBqb2IgaW4gZW11bGF0aW5nIE1TIGJlaGF2aW9yLiBTb21lIHF1aXJrcyBhcmUKICogaG93ZXZlciB0aGVyZSBiZWNhdXNlIE1TIHVzZXMgYSBUcnVlVHlwZSBmb250IChNYXJsZXR0KSB0byBkcmF3CiAqIHRoZSBidXR0b25zLgogKi8KI2RlZmluZSBERkNfQ0hFQ0tQT0lOVFNNQVggICAgICA2CgpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfREZDX0J1dHRvbkNoZWNrKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBSRUNUIG15cjsKICAgIGludCBTbWFsbERpYW0gPSBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpOwogICAgVUlOVCBmbGFncyA9IEJGX1JFQ1QgfCBCRl9BREpVU1Q7CgogICAgaWYodUZsYWdzICYgREZDU19GTEFUKSBmbGFncyB8PSBCRl9GTEFUOwogICAgZWxzZSBpZih1RmxhZ3MgJiBERkNTX01PTk8pIGZsYWdzIHw9IEJGX01PTk87CgogICAgVUlUT09MUzk1X0RyYXdSZWN0RWRnZSggZGMsICZteXIsIEVER0VfU1VOS0VOLCBmbGFncyApOwoKICAgIGlmKHVGbGFncyAmIChERkNTX0lOQUNUSVZFfERGQ1NfUFVTSEVEKSkKICAgICAgICBGaWxsUmVjdChkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5GQUNFKSk7CiAgICBlbHNlIGlmKCAodUZsYWdzICYgREZDU19CVVRUT04zU1RBVEUpICYmICh1RmxhZ3MgJiBERkNTX0NIRUNLRUQpICkKICAgICAgICBVSVRPT0xTX0RyYXdDaGVja2VkUmVjdCggZGMsICZteXIgKTsKICAgIGVsc2UKICAgIHsKICAgICAgICBGaWxsUmVjdChkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9XSU5ET1cpKTsKICAgIH0KCiAgICBpZih1RmxhZ3MgJiBERkNTX0NIRUNLRUQpCiAgICB7CiAgICAgICAgUE9JTlQgQ2hlY2tQb2ludHNbREZDX0NIRUNLUE9JTlRTTUFYXTsKICAgICAgICBpbnQgaTsKICAgICAgICBIQlJVU0ggaGJzYXZlOwogICAgICAgIEhQRU4gaHBzYXZlOwoKICAgICAgICAvKiBGSVhNRTogVGhpcyBjb21lcyB2ZXJ5IGNsb3NlIHRvIE0kJ3MgY2hlY2ttYXJrLCBidXQgbm90ICovCiAgICAgICAgLyogZXhhY3RseS4uLiBXaGVuIHNtYWxsIG9yIGxhcmdlIHRoZXJlIGlzIGEgZmV3IHBpeGVscyAqLwogICAgICAgIC8qIHNoaWZ0LiBOb3QgYmFkLCBidXQgY291bGQgYmUgYmV0dGVyIDopICovCiAgICAgICAgVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKTsKICAgICAgICBDaGVja1BvaW50c1swXS54ID0gbXlyLmxlZnQgKyAyNTMqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgQ2hlY2tQb2ludHNbMF0ueSA9IG15ci50b3AgICsgMzQ1KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIENoZWNrUG9pbnRzWzFdLnggPSBteXIubGVmdCArIDQwOSpTbWFsbERpYW0vMTAwMDsKICAgICAgICBDaGVja1BvaW50c1sxXS55ID0gQ2hlY2tQb2ludHNbMF0ueSArIChDaGVja1BvaW50c1sxXS54LUNoZWNrUG9pbnRzWzBdLngpOwogICAgICAgIENoZWNrUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDY5MCpTbWFsbERpYW0vMTAwMDsKICAgICAgICBDaGVja1BvaW50c1syXS55ID0gQ2hlY2tQb2ludHNbMV0ueSAtIChDaGVja1BvaW50c1syXS54LUNoZWNrUG9pbnRzWzFdLngpOwogICAgICAgIENoZWNrUG9pbnRzWzNdLnggPSBDaGVja1BvaW50c1syXS54OwogICAgICAgIENoZWNrUG9pbnRzWzNdLnkgPSBDaGVja1BvaW50c1syXS55ICsgMypTbWFsbERpYW0vMTY7CiAgICAgICAgQ2hlY2tQb2ludHNbNF0ueCA9IENoZWNrUG9pbnRzWzFdLng7CiAgICAgICAgQ2hlY2tQb2ludHNbNF0ueSA9IENoZWNrUG9pbnRzWzFdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBDaGVja1BvaW50c1s1XS54ID0gQ2hlY2tQb2ludHNbMF0ueDsKICAgICAgICBDaGVja1BvaW50c1s1XS55ID0gQ2hlY2tQb2ludHNbMF0ueSArIDMqU21hbGxEaWFtLzE2OwoKICAgICAgICBpID0gKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpIHx8ICh1RmxhZ3MgJiAweGZmKSA9PSBERkNTX0JVVFRPTjNTVEFURSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX1dJTkRPV1RFWFQ7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oaSkpOwogICAgICAgIFBvbHlnb24oZGMsIENoZWNrUG9pbnRzLCBERkNfQ0hFQ0tQT0lOVFNNQVgpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJVUlUT09MU19ERkNfQnV0dG9uUmFkaW8KICoKICogRHJhdyBhIHJhZGlvL3JhZGlvaW1hZ2UvcmFkaW9tYXNrIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICoKICogRG9lcyBhIHByZXR0eSBnb29kIGpvYiBpbiBlbXVsYXRpbmcgTVMgYmVoYXZpb3IuIFNvbWUgcXVpcmtzIGFyZQogKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKICogdGhlIGJ1dHRvbnMuCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfREZDX0J1dHRvblJhZGlvKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBSRUNUIG15cjsKICAgIGludCBpOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICBpbnQgQm9yZGVyU2hyaW5rID0gU21hbGxEaWFtIC8gMTY7CiAgICBIUEVOIGhwc2F2ZTsKICAgIEhCUlVTSCBoYnNhdmU7CiAgICBpbnQgeGUsIHllOwogICAgaW50IHhjLCB5YzsKCiAgICBpZihCb3JkZXJTaHJpbmsgPCAxKSBCb3JkZXJTaHJpbmsgPSAxOwoKICAgIGlmKCh1RmxhZ3MgJiAweGZmKSA9PSBERkNTX0JVVFRPTlJBRElPSU1BR0UpCiAgICB7CiAgICAgICAgRmlsbFJlY3QoZGMsIHIsIChIQlJVU0gpR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKICAgIH0KCiAgICB4ZSA9IG15ci5sZWZ0OwogICAgeWUgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwoKICAgIHhjID0gbXlyLmxlZnQgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKICAgIHljID0gbXlyLnRvcCAgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKCiAgICAvKiBEZWZpbmUgYm91bmRpbmcgYm94ICovCiAgICBpID0gMTQqU21hbGxEaWFtLzE2OwogICAgbXlyLmxlZnQgICA9IHhjIC0gaStpLzI7CiAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKICAgIG15ci5ib3R0b20gPSB5YyArIGkvMjsKCiAgICBpZigodUZsYWdzICYgMHhmZikgPT0gREZDU19CVVRUT05SQURJT01BU0spCiAgICB7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CiAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmKHVGbGFncyAmIChERkNTX0ZMQVR8REZDU19NT05PKSkKICAgICAgICB7CiAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfV0lORE9XRlJBTUUpKTsKICAgICAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfV0lORE9XRlJBTUUpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIubGVmdC0xLCBteXIuYm90dG9tLCBteXIucmlnaHQtMSwgbXlyLnRvcCk7CgogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTlNIQURPVykpOwogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlROU0hBRE9XKSk7CiAgICAgICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgbXlyLnJpZ2h0KzEsIG15ci50b3AsIG15ci5sZWZ0KzEsIG15ci5ib3R0b20pOwoKICAgICAgICAgICAgbXlyLmxlZnQgICArPSBCb3JkZXJTaHJpbms7CiAgICAgICAgICAgIG15ci5yaWdodCAgLT0gQm9yZGVyU2hyaW5rOwogICAgICAgICAgICBteXIudG9wICAgICs9IEJvcmRlclNocmluazsKICAgICAgICAgICAgbXlyLmJvdHRvbSAtPSBCb3JkZXJTaHJpbms7CgogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SXzNETElHSFQpKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SXzNETElHSFQpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIubGVmdC0xLCBteXIuYm90dG9tLCBteXIucmlnaHQtMSwgbXlyLnRvcCk7CgogICAgICAgICAgICBTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SXzNEREtTSEFET1cpKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SXzNEREtTSEFET1cpKTsKICAgICAgICAgICAgUGllKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIucmlnaHQrMSwgbXlyLnRvcCwgbXlyLmxlZnQrMSwgbXlyLmJvdHRvbSk7CiAgICAgICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIH0KCiAgICAgICAgaSA9IDEwKlNtYWxsRGlhbS8xNjsKICAgICAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKICAgICAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICAgICAgbXlyLnRvcCAgICA9IHljIC0gaStpLzI7CiAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwogICAgICAgIGk9ICEodUZsYWdzICYgKERGQ1NfSU5BQ1RJVkV8REZDU19QVVNIRUQpKSA/IENPTE9SX1dJTkRPVyA6IENPTE9SX0JUTkZBQ0U7CiAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihpKSk7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICB9CgogICAgaWYodUZsYWdzICYgREZDU19DSEVDS0VEKQogICAgewogICAgICAgIGkgPSA2KlNtYWxsRGlhbS8xNjsKICAgICAgICBpID0gaSA8IDEgPyAxIDogaTsKICAgICAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKICAgICAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICAgICAgbXlyLnRvcCAgICA9IHljIC0gaStpLzI7CiAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwoKICAgICAgICBpID0gdUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX1dJTkRPV1RFWFQ7CiAgICAgICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oaSkpOwogICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CgogICAgLyogRklYTUU6IE0kIGhhcyBhIHBvbHlnb24gaW4gdGhlIGNlbnRlciBhdCByZWxhdGl2ZSBwb2ludHM6ICovCiAgICAvKiAwLjQ3NiwgMC40NzYgKHRpbWVzIFNtYWxsRGlhbSwgU21hbGxEaWFtKSAqLwogICAgLyogMC40NzYsIDAuNTI1ICovCiAgICAvKiAwLjUwMCwgMC41MDAgKi8KICAgIC8qIDAuNTAwLCAwLjQ5OSAqLwogICAgLyogd2hlbiB0aGUgYnV0dG9uIGlzIHVuY2hlY2tlZC4gVGhlIHJlYXNvbiBmb3IgaXQgaXMgdW5rbm93bi4gVGhlICovCiAgICAvKiBjb2xvciBpcyBDT0xPUl9CVE5ISUdITElHSFQsIGFsdGhvdWdoIHRoZSBwb2x5Z29uIGdldHMgcGFpbnRlZCBhdCAqLwogICAgLyogbGVhc3QgMyB0aW1lcyAoaXQgbG9va3MgbGlrZSBhIGNsaXAtcmVnaW9uIHdoZW4geW91IHNlZSBpdCBoYXBwZW4pLiAqLwogICAgLyogSSBkbyBub3QgcmVhbGx5IHNlZSBhIHJlYXNvbiB3aHkgdGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQuIElmIHlvdSAqLwogICAgLyogaGF2ZSBhIGdvb2QgcmVhc29uLCBsZXQgbWUga25vdy4gTWF5YmUgdGhpcyBpcyBhIHF1aXJrIGluIHRoZSBNYXJsZXR0ICovCiAgICAvKiBmb250LiAqLwoKICAgIHJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lQnV0dG9uCiAqLwpzdGF0aWMgQk9PTCBVSVRPT0xTOTVfRHJhd0ZyYW1lQnV0dG9uKEhEQyBoZGMsIExQUkVDVCByYywgVUlOVCB1U3RhdGUpCnsKICAgIHN3aXRjaCh1U3RhdGUgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX0JVVFRPTlBVU0g6CiAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uUHVzaChoZGMsIHJjLCB1U3RhdGUpOwoKICAgIGNhc2UgREZDU19CVVRUT05DSEVDSzoKICAgIGNhc2UgREZDU19CVVRUT04zU1RBVEU6CiAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uQ2hlY2soaGRjLCByYywgdVN0YXRlKTsKCiAgICBjYXNlIERGQ1NfQlVUVE9OUkFESU9JTUFHRToKICAgIGNhc2UgREZDU19CVVRUT05SQURJT01BU0s6CiAgICBjYXNlIERGQ1NfQlVUVE9OUkFESU86CiAgICAgICAgcmV0dXJuIFVJVE9PTFM5NV9ERkNfQnV0dG9uUmFkaW8oaGRjLCByYywgdVN0YXRlKTsKCiAgICBkZWZhdWx0OgogICAgICAgIFdBUk4oIkludmFsaWQgYnV0dG9uIHN0YXRlPTB4JTA0eFxuIiwgdVN0YXRlKTsKICAgIH0KCiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVUlUT09MU19EcmF3RnJhbWVDYXB0aW9uCiAqCiAqIERyYXcgY2FwdGlvbiBidXR0b25zICh3aW45NSksIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKi8KCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3RnJhbWVDYXB0aW9uKEhEQyBkYywgTFBSRUNUIHIsIFVJTlQgdUZsYWdzKQp7CiAgICBQT0lOVCBMaW5lMVsxMF07CiAgICBQT0lOVCBMaW5lMlsxMF07CiAgICBpbnQgTGluZTFOOwogICAgaW50IExpbmUyTjsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15ciktMjsKICAgIGludCBpOwogICAgSEJSVVNIIGhic2F2ZTsKICAgIEhQRU4gaHBzYXZlOwogICAgSEZPTlQgaGZzYXZlLCBoZjsKICAgIGludCB4YyA9IChteXIubGVmdCtteXIucmlnaHQpLzI7CiAgICBpbnQgeWMgPSAobXlyLnRvcCtteXIuYm90dG9tKS8yOwogICAgaW50IGVkZ2UsIG1vdmU7CiAgICBjaGFyIHN0clsyXSA9ICI/IjsKICAgIFVJTlQgYWxpZ25zYXZlOwogICAgaW50IGJrc2F2ZTsKICAgIENPTE9SUkVGIGNscnNhdmU7CiAgICBTSVpFIHNpemU7CgogICAgVUlUT09MUzk1X0RGQ19CdXR0b25QdXNoKGRjLCByLCB1RmxhZ3MgJiAweGZmMDApOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX0NBUFRJT05DTE9TRToKICAgICAgICBlZGdlID0gMzI4KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIG1vdmUgPSA5NSpTbWFsbERpYW0vMTAwMDsKICAgICAgICBMaW5lMVswXS54ID0gTGluZTJbMF0ueCA9IExpbmUxWzFdLnggPSBMaW5lMlsxXS54ID0geGMgLSBlZGdlOwogICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMls1XS55ID0gTGluZTFbMV0ueSA9IExpbmUyWzRdLnkgPSB5YyAtIGVkZ2U7CiAgICAgICAgTGluZTFbM10ueCA9IExpbmUyWzNdLnggPSBMaW5lMVs0XS54ID0gTGluZTJbNF0ueCA9IHhjICsgZWRnZTsKICAgICAgICBMaW5lMVs1XS55ID0gTGluZTJbMl0ueSA9IExpbmUxWzRdLnkgPSBMaW5lMlsxXS55ID0geWMgKyBlZGdlOwogICAgICAgIExpbmUxWzJdLnggPSBMaW5lMlsyXS54ID0gTGluZTFbMV0ueCArIG1vdmU7CiAgICAgICAgTGluZTFbMF0ueSA9IExpbmUyWzNdLnkgPSBMaW5lMVsxXS55ICsgbW92ZTsKICAgICAgICBMaW5lMVs1XS54ID0gTGluZTJbNV0ueCA9IExpbmUxWzRdLnggLSBtb3ZlOwogICAgICAgIExpbmUxWzNdLnkgPSBMaW5lMlswXS55ID0gTGluZTFbNF0ueSAtIG1vdmU7CiAgICAgICAgTGluZTFOID0gNjsKICAgICAgICBMaW5lMk4gPSA2OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19DQVBUSU9OSEVMUDoKICAgICAgICAvKiBUaGlzIG9uZSBicmVha3MgdGhlIGZsb3cgKi8KICAgICAgICAvKiBGSVhNRTogV2UgbmVlZCB0aGUgTWFybGV0dCBmb250IGluIG9yZGVyIHRvIGdldCB0aGlzIHJpZ2h0LiAqLwoKICAgICAgICBoZiA9IENyZWF0ZUZvbnRBKC1TbWFsbERpYW0sIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgQU5TSV9DSEFSU0VULCBPVVRfREVGQVVMVF9QUkVDSVMsIENMSVBfREVGQVVMVF9QUkVDSVMsCiAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUVVBTElUWSwgRklYRURfUElUQ0h8RkZfRE9OVENBUkUsICJTeXN0ZW0iKTsKICAgICAgICBhbGlnbnNhdmUgPSBTZXRUZXh0QWxpZ24oZGMsIFRBX1RPUHxUQV9MRUZUKTsKICAgICAgICBia3NhdmUgPSBTZXRCa01vZGUoZGMsIFRSQU5TUEFSRU5UKTsKICAgICAgICBjbHJzYXZlID0gR2V0VGV4dENvbG9yKGRjKTsKICAgICAgICBoZnNhdmUgPSAoSEZPTlQpU2VsZWN0T2JqZWN0KGRjLCBoZik7CiAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MzJBKGRjLCBzdHIsIDEsICZzaXplKTsKCiAgICAgICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKICAgICAgICB7CiAgICAgICAgICAgIFNldFRleHRDb2xvcihkYywgR2V0U3lzQ29sb3IoQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgICAgIFRleHRPdXRBKGRjLCB4Yy1zaXplLmN4LzIrMSwgeWMtc2l6ZS5jeS8yKzEsIHN0ciwgMSk7CiAgICAgICAgfQogICAgICAgIFNldFRleHRDb2xvcihkYywgR2V0U3lzQ29sb3IodUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX0JUTlRFWFQpKTsKICAgICAgICBUZXh0T3V0QShkYywgeGMtc2l6ZS5jeC8yLCB5Yy1zaXplLmN5LzIsIHN0ciwgMSk7CgogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGZzYXZlKTsKICAgICAgICBTZXRUZXh0Q29sb3IoZGMsIGNscnNhdmUpOwogICAgICAgIFNldEJrTW9kZShkYywgYmtzYXZlKTsKICAgICAgICBTZXRUZXh0QWxpZ24oZGMsIGFsaWduc2F2ZSk7CiAgICAgICAgRGVsZXRlT2JqZWN0KGhmKTsKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICBjYXNlIERGQ1NfQ0FQVElPTk1JTjoKICAgICAgICBMaW5lMVswXS54ID0gTGluZTFbM10ueCA9IG15ci5sZWZ0ICAgKyAgOTYqU21hbGxEaWFtLzc1MCsyOwogICAgICAgIExpbmUxWzFdLnggPSBMaW5lMVsyXS54ID0gTGluZTFbMF0ueCArIDM3MipTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgICArIDU2MypTbWFsbERpYW0vNzUwKzE7CiAgICAgICAgTGluZTFbMl0ueSA9IExpbmUxWzNdLnkgPSBMaW5lMVswXS55ICsgIDkyKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFOID0gNDsKICAgICAgICBMaW5lMk4gPSAwOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19DQVBUSU9OTUFYOgogICAgICAgIGVkZ2UgPSA0NypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzBdLnggPSBMaW5lMVs1XS54ID0gbXlyLmxlZnQgKyAgNTcqU21hbGxEaWFtLzc1MCszOwogICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgKyAxNDMqU21hbGxEaWFtLzc1MCsxOwogICAgICAgIExpbmUxWzFdLnggPSBMaW5lMVsyXS54ID0gTGluZTFbMF0ueCArIDU2MipTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzVdLnkgPSBMaW5lMVs0XS55ID0gTGluZTFbMF0ueSArICA5MypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMVszXS55ID0gTGluZTFbMF0ueSArIDUxMypTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzNdLnggPSBMaW5lMVs0XS54ID0gTGluZTFbMV0ueCAtICBlZGdlOwoKICAgICAgICBMaW5lMlswXS54ID0gTGluZTJbNV0ueCA9IExpbmUxWzBdLng7CiAgICAgICAgTGluZTJbM10ueCA9IExpbmUyWzRdLnggPSBMaW5lMVsxXS54OwogICAgICAgIExpbmUyWzFdLnggPSBMaW5lMlsyXS54ID0gTGluZTFbMF0ueCArIGVkZ2U7CiAgICAgICAgTGluZTJbMF0ueSA9IExpbmUyWzFdLnkgPSBMaW5lMVswXS55OwogICAgICAgIExpbmUyWzRdLnkgPSBMaW5lMls1XS55ID0gTGluZTFbMl0ueTsKICAgICAgICBMaW5lMlsyXS55ID0gTGluZTJbM10ueSA9IExpbmUxWzJdLnkgLSBlZGdlOwogICAgICAgIExpbmUxTiA9IDY7CiAgICAgICAgTGluZTJOID0gNjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfQ0FQVElPTlJFU1RPUkU6CiAgICAgICAgLyogRklYTUU6IHRoaXMgb25lIGxvb2tzIGJhZCBhdCBzbWFsbCBzaXplcyA8IDE1eDE1IDooICovCiAgICAgICAgZWRnZSA9IDQ3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgbW92ZSA9IDQyMCpTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmUxWzBdLnggPSBMaW5lMVs5XS54ID0gbXlyLmxlZnQgKyAxOTgqU21hbGxEaWFtLzc1MCsyOwogICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgKyAxNjkqU21hbGxEaWFtLzc1MCsxOwogICAgICAgIExpbmUxWzZdLnkgPSBMaW5lMVs3XS55ID0gTGluZTFbMF0ueSArIDkzKlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbN10ueCA9IExpbmUxWzhdLnggPSBMaW5lMVswXS54ICsgZWRnZTsKICAgICAgICBMaW5lMVsxXS54ID0gTGluZTFbMl0ueCA9IExpbmUxWzBdLnggKyBtb3ZlOwogICAgICAgIExpbmUxWzVdLnggPSBMaW5lMVs2XS54ID0gTGluZTFbMV0ueCAtIGVkZ2U7CiAgICAgICAgTGluZTFbOV0ueSA9IExpbmUxWzhdLnkgPSBMaW5lMVswXS55ICsgMTg3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbMl0ueSA9IExpbmUxWzNdLnkgPSBMaW5lMVswXS55ICsgMzI3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgTGluZTFbNF0ueSA9IExpbmUxWzVdLnkgPSBMaW5lMVsyXS55IC0gZWRnZTsKICAgICAgICBMaW5lMVszXS54ID0gTGluZTFbNF0ueCA9IExpbmUxWzJdLnggLSAxNDAqU21hbGxEaWFtLzc1MDsKCiAgICAgICAgTGluZTJbMV0ueCA9IExpbmUyWzJdLnggPSBMaW5lMVszXS54OwogICAgICAgIExpbmUyWzddLnggPSBMaW5lMls4XS54ID0gTGluZTJbMV0ueCAtIGVkZ2U7CiAgICAgICAgTGluZTJbMF0ueCA9IExpbmUyWzldLnggPSBMaW5lMlszXS54ID0gTGluZTJbNF0ueCA9IExpbmUyWzFdLnggLSBtb3ZlOwogICAgICAgIExpbmUyWzVdLnggPSBMaW5lMls2XS54ID0gTGluZTJbMF0ueCArIGVkZ2U7CiAgICAgICAgTGluZTJbMF0ueSA9IExpbmUyWzFdLnkgPSBMaW5lMVs5XS55OwogICAgICAgIExpbmUyWzRdLnkgPSBMaW5lMls1XS55ID0gTGluZTJbOF0ueSA9IExpbmUyWzldLnkgPSBMaW5lMlswXS55ICsgOTMqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMlsyXS55ID0gTGluZTJbM10ueSA9IExpbmUyWzBdLnkgKyAzMjcqU21hbGxEaWFtLzc1MDsKICAgICAgICBMaW5lMls2XS55ID0gTGluZTJbN10ueSA9IExpbmUyWzJdLnkgLSBlZGdlOwogICAgICAgIExpbmUxTiA9IDEwOwogICAgICAgIExpbmUyTiA9IDEwOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiSW52YWxpZCBjYXB0aW9uOyBmbGFncz0weCUwNHhcbiIsIHVGbGFncyk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIEhlcmUgdGhlIGRyYXdpbmcgdGFrZXMgcGxhY2UgKi8KICAgIGlmKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpCiAgICB7CiAgICAgICAgLyogSWYgd2UgaGF2ZSBhbiBpbmFjdGl2ZSBidXR0b24sIHRoZW4geW91IHNlZSBhIHNoYWRvdyAqLwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvckJydXNoKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIGhwc2F2ZSA9IChIUEVOKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JQZW4oQ09MT1JfQlROSElHSExJR0hUKSk7CiAgICAgICAgUG9seWdvbihkYywgTGluZTEsIExpbmUxTik7CiAgICAgICAgaWYoTGluZTJOID4gMCkKICAgICAgICAgICAgUG9seWdvbihkYywgTGluZTIsIExpbmUyTik7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgIH0KCiAgICAvKiBDb3JyZWN0IGZvciB0aGUgc2hhZG93IHNoaWZ0ICovCiAgICBmb3IoaSA9IDA7IGkgPCBMaW5lMU47IGkrKykKICAgIHsKICAgICAgICBMaW5lMVtpXS54LS07CiAgICAgICAgTGluZTFbaV0ueS0tOwogICAgfQogICAgZm9yKGkgPSAwOyBpIDwgTGluZTJOOyBpKyspCiAgICB7CiAgICAgICAgTGluZTJbaV0ueC0tOwogICAgICAgIExpbmUyW2ldLnktLTsKICAgIH0KCiAgICAvKiBNYWtlIHRoZSBmaW5hbCBwaWN0dXJlICovCiAgICBpID0gdUZsYWdzICYgREZDU19JTkFDVElWRSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX0JUTlRFWFQ7CiAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChpKSk7CiAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKGkpKTsKCiAgICBQb2x5Z29uKGRjLCBMaW5lMSwgTGluZTFOKTsKICAgIGlmKExpbmUyTiA+IDApCiAgICAgICAgUG9seWdvbihkYywgTGluZTIsIExpbmUyTik7CiAgICBTZWxlY3RPYmplY3QoZGMsIGhwc2F2ZSk7CiAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgVUlUT09MU19EcmF3RnJhbWVTY3JvbGwKICoKICogRHJhdyBhIHNjcm9sbC1iYXIgY29udHJvbCBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICovCnN0YXRpYyBCT09MIFVJVE9PTFM5NV9EcmF3RnJhbWVTY3JvbGwoSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFBPSU5UIExpbmVbNF07CiAgICBSRUNUIG15cjsKICAgIGludCBTbWFsbERpYW0gPSBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpIC0gMjsKICAgIGludCBpOwogICAgSEJSVVNIIGhic2F2ZSwgaGIsIGhiMjsKICAgIEhQRU4gaHBzYXZlLCBocCwgaHAyOwogICAgaW50IHRyaSA9IDI5MCpTbWFsbERpYW0vMTAwMCAtIDE7CiAgICBpbnQgZDQ2LCBkOTM7CgogICAgLyoKICAgICAqIFRoaXMgZml4ZXMgYSBwcm9ibGVtIHdpdGggcmVhbGx5IHRpbnkgInNjcm9sbCIgYnV0dG9ucy4gSW4gcGFydGljdWxhcgogICAgICogd2l0aCB0aGUgdXBkb3duIGNvbnRyb2wuIAogICAgICogTWFraW5nIHN1cmUgdGhhdCB0aGUgYXJyb3cgaXMgYXMgbGVhc3QgMyBwaXhlbHMgd2lkZSAob3IgaGlnaCkuCiAgICAgKi8KICAgIGlmICh0cmkgPT0gMCkKICAgICAgdHJpID0gMTsKCiAgICBzd2l0Y2godUZsYWdzICYgMHhmZikKICAgIHsKICAgIGNhc2UgREZDU19TQ1JPTExDT01CT0JPWDoKICAgIGNhc2UgREZDU19TQ1JPTExET1dOOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzJdLnkgPSBteXIudG9wICArIDY4NypTbWFsbERpYW0vMTAwMCArIDE7CiAgICAgICAgTGluZVswXS54ID0gTGluZVsyXS54IC0gdHJpOwogICAgICAgIExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzFdLnkgPSBMaW5lWzJdLnkgLSB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTFVQOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKICAgICAgICBMaW5lWzJdLnkgPSBteXIuYm90dG9tIC0gKDY4NypTbWFsbERpYW0vMTAwMCArIDEpOwogICAgICAgIExpbmVbMF0ueCA9IExpbmVbMl0ueCAtIHRyaTsKICAgICAgICBMaW5lWzFdLnggPSBMaW5lWzJdLnggKyB0cmk7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ID0gTGluZVsyXS55ICsgdHJpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19TQ1JPTExMRUZUOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5yaWdodCAtICg2ODcqU21hbGxEaWFtLzEwMDAgKyAxKTsKICAgICAgICBMaW5lWzJdLnkgPSBteXIudG9wICArIDQ3MCpTbWFsbERpYW0vMTAwMCArIDI7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsyXS55IC0gdHJpOwogICAgICAgIExpbmVbMV0ueSA9IExpbmVbMl0ueSArIHRyaTsKICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzFdLnggPSBMaW5lWzJdLnggKyB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTFJJR0hUOgogICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNjg3KlNtYWxsRGlhbS8xMDAwICsgMTsKICAgICAgICBMaW5lWzJdLnkgPSBteXIudG9wICArIDQ3MCpTbWFsbERpYW0vMTAwMCArIDI7CiAgICAgICAgTGluZVswXS55ID0gTGluZVsyXS55IC0gdHJpOwogICAgICAgIExpbmVbMV0ueSA9IExpbmVbMl0ueSArIHRyaTsKICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzFdLnggPSBMaW5lWzJdLnggLSB0cmk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBERkNTX1NDUk9MTFNJWkVHUklQOgogICAgICAgIC8qIFRoaXMgb25lIGJyZWFrcyB0aGUgZmxvdy4uLiAqLwogICAgICAgIFVJVE9PTFM5NV9EcmF3UmVjdEVkZ2UoZGMsIHIsIEVER0VfQlVNUCwgQkZfTUlERExFIHwgKCh1RmxhZ3MmKERGQ1NfTU9OT3xERkNTX0ZMQVQpKSA/IEJGX01PTk8gOiAwKSk7CiAgICAgICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX1BFTikpOwogICAgICAgIGhic2F2ZSA9IChIQlJVU0gpU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9ja09iamVjdChOVUxMX0JSVVNIKSk7CiAgICAgICAgaWYodUZsYWdzICYgKERGQ1NfTU9OT3xERkNTX0ZMQVQpKQogICAgICAgIHsKICAgICAgICAgICAgaHAgPSBocDIgPSBHZXRTeXNDb2xvclBlbihDT0xPUl9XSU5ET1dGUkFNRSk7CiAgICAgICAgICAgIGhiID0gaGIyID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9XSU5ET1dGUkFNRSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGhwICA9IEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCk7CiAgICAgICAgICAgIGhwMiA9IEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTlNIQURPVyk7CiAgICAgICAgICAgIGhiICA9IEdldFN5c0NvbG9yQnJ1c2goQ09MT1JfQlROSElHSExJR0hUKTsKICAgICAgICAgICAgaGIyID0gR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5TSEFET1cpOwogICAgICAgIH0KICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzFdLnggPSByLT5yaWdodC0xOwogICAgICAgIExpbmVbMl0ueSA9IExpbmVbM10ueSA9IHItPmJvdHRvbS0xOwogICAgICAgIGQ0NiA9IDQ2KlNtYWxsRGlhbS83NTA7CiAgICAgICAgZDkzID0gOTMqU21hbGxEaWFtLzc1MDsKCiAgICAgICAgaSA9IDU4NipTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmVbMF0ueSA9IHItPmJvdHRvbSAtIGkgLSAxOwogICAgICAgIExpbmVbM10ueCA9IHItPnJpZ2h0IC0gaSAtIDE7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVswXS55ICsgZDQ2OwogICAgICAgIExpbmVbMl0ueCA9IExpbmVbM10ueCArIGQ0NjsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgTGluZVsxXS55Kys7IExpbmVbMl0ueCsrOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSArIGQ5MzsKICAgICAgICBMaW5lWzNdLnggPSBMaW5lWzJdLnggKyBkOTM7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYjIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHAyKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgaSA9IDM5OCpTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmVbMF0ueSA9IHItPmJvdHRvbSAtIGkgLSAxOwogICAgICAgIExpbmVbM10ueCA9IHItPnJpZ2h0IC0gaSAtIDE7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVswXS55ICsgZDQ2OwogICAgICAgIExpbmVbMl0ueCA9IExpbmVbM10ueCArIGQ0NjsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgTGluZVsxXS55Kys7IExpbmVbMl0ueCsrOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSArIGQ5MzsKICAgICAgICBMaW5lWzNdLnggPSBMaW5lWzJdLnggKyBkOTM7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYjIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHAyKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgaSA9IDIxMCpTbWFsbERpYW0vNzUwOwogICAgICAgIExpbmVbMF0ueSA9IHItPmJvdHRvbSAtIGkgLSAxOwogICAgICAgIExpbmVbM10ueCA9IHItPnJpZ2h0IC0gaSAtIDE7CiAgICAgICAgTGluZVsxXS55ID0gTGluZVswXS55ICsgZDQ2OwogICAgICAgIExpbmVbMl0ueCA9IExpbmVbM10ueCArIGQ0NjsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhiKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhwKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgTGluZVsxXS55Kys7IExpbmVbMl0ueCsrOwogICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSArIGQ5MzsKICAgICAgICBMaW5lWzNdLnggPSBMaW5lWzJdLnggKyBkOTM7CiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBoYjIpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHAyKTsKICAgICAgICBQb2x5Z29uKGRjLCBMaW5lLCA0KTsKCiAgICAgICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICBkZWZhdWx0OgogICAgICAgIFdBUk4oIkludmFsaWQgc2Nyb2xsOyBmbGFncz0weCUwNHhcbiIsIHVGbGFncyk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIEhlcmUgZG8gdGhlIHJlYWwgc2Nyb2xsLWJhciBjb250cm9scyBlbmQgdXAgKi8KICAgIGlmKCAhICh1RmxhZ3MgJiAoMHhmZjAwICYgfkRGQ1NfQURKVVNUUkVDVCkpICkKICAgICAgLyogVUlUT09MUzk1X0RGQ19CdXR0b25QdXNoIGFsd2F5cyB1c2VzIEJGX1NPRlQgd2hpY2ggd2UgZG9uJ3QgKi8KICAgICAgLyogd2FudCBmb3IgdGhlIG5vcm1hbCBzY3JvbGwtYXJyb3cgYnV0dG9uLiAqLwogICAgICBVSVRPT0xTOTVfRHJhd1JlY3RFZGdlKCBkYywgciwgRURHRV9SQUlTRUQsICh1RmxhZ3MmREZDU19BREpVU1RSRUNUKSB8IEJGX01JRERMRSB8IEJGX1JFQ1QpOwogICAgZWxzZQogICAgICBVSVRPT0xTOTVfREZDX0J1dHRvblB1c2goZGMsIHIsICh1RmxhZ3MgJiAweGZmMDApICk7CgogICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKICAgIHsKICAgICAgICBoYnNhdmUgPSAoSEJSVVNIKVNlbGVjdE9iamVjdChkYywgR2V0U3lzQ29sb3JCcnVzaChDT0xPUl9CVE5ISUdITElHSFQpKTsKICAgICAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yUGVuKENPTE9SX0JUTkhJR0hMSUdIVCkpOwogICAgICAgIFBvbHlnb24oZGMsIExpbmUsIDMpOwogICAgICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgICAgICBTZWxlY3RPYmplY3QoZGMsIGhic2F2ZSk7CiAgICB9CgogICAgaWYoICh1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKSB8fCAhKHVGbGFncyAmIERGQ1NfUFVTSEVEKSApCiAgICAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykKICAgICAgewogICAgICAgIExpbmVbaV0ueC0tOwogICAgICAgIExpbmVbaV0ueS0tOwogICAgICB9CgogICAgaSA9IHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUgPyBDT0xPUl9CVE5TSEFET1cgOiBDT0xPUl9CVE5URVhUOwogICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN5c0NvbG9yQnJ1c2goaSkpOwogICAgaHBzYXZlID0gKEhQRU4pU2VsZWN0T2JqZWN0KGRjLCBHZXRTeXNDb2xvclBlbihpKSk7CiAgICBQb2x5Z29uKGRjLCBMaW5lLCAzKTsKICAgIFNlbGVjdE9iamVjdChkYywgaHBzYXZlKTsKICAgIFNlbGVjdE9iamVjdChkYywgaGJzYXZlKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lTWVudQogKgogKiBEcmF3IGEgbWVudSBjb250cm9sIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogKi8Kc3RhdGljIEJPT0wgVUlUT09MUzk1X0RyYXdGcmFtZU1lbnUoSERDIGRjLCBMUFJFQ1QgciwgVUlOVCB1RmxhZ3MpCnsKICAgIFBPSU5UIFBvaW50c1s2XTsKICAgIFJFQ1QgbXlyOwogICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CiAgICBpbnQgaTsKICAgIEhCUlVTSCBoYnNhdmU7CiAgICBIUEVOIGhwc2F2ZTsKICAgIGludCB4ZSwgeWU7CiAgICBpbnQgeGMsIHljOwogICAgQk9PTCByZXR2YWwgPSBUUlVFOwoKICAgIC8qIFVzaW5nIGJsYWNrIGFuZCB3aGl0ZSBzZWVtcyB0byBiZSB1dHRlcmx5IHdyb25nLCBidXQgd2luOTUgZG9lc24ndCAqLwogICAgLyogdXNlIGFueXRoaW5nIGVsc2UuIEkgdGhpbmsgSSB0cmllZCBhbGwgc3lzLWNvbG9ycyB0byBjaGFuZ2UgdGhpbmdzICovCiAgICAvKiB3aXRob3V0IGx1Y2suIEl0IHNlZW1zIGFzIGlmIHRoaXMgYmVoYXZpb3IgaXMgaW5oZXJpdGVkIGZyb20gdGhlICovCiAgICAvKiB3aW4zMSBERkMoKSBpbXBsZW1lbnRhdGlvbi4uLiAoeW91IHJlbWVtYmVyLCBCL1cgbWVudXMpLiAqLwoKICAgIEZpbGxSZWN0KGRjLCByLCAoSEJSVVNIKUdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKSk7CgogICAgaGJzYXZlID0gKEhCUlVTSClTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7CiAgICBocHNhdmUgPSAoSFBFTilTZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KEJMQUNLX1BFTikpOwoKICAgIHN3aXRjaCh1RmxhZ3MgJiAweGZmKQogICAgewogICAgY2FzZSBERkNTX01FTlVBUlJPVzoKICAgICAgICBpID0gMTg3KlNtYWxsRGlhbS83NTA7CiAgICAgICAgUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDQ2OCpTbWFsbERpYW0vNzUwOwogICAgICAgIFBvaW50c1syXS55ID0gbXlyLnRvcCAgKyAzNTIqU21hbGxEaWFtLzc1MCsxOwogICAgICAgIFBvaW50c1swXS55ID0gUG9pbnRzWzJdLnkgLSBpOwogICAgICAgIFBvaW50c1sxXS55ID0gUG9pbnRzWzJdLnkgKyBpOwogICAgICAgIFBvaW50c1swXS54ID0gUG9pbnRzWzFdLnggPSBQb2ludHNbMl0ueCAtIGk7CiAgICAgICAgUG9seWdvbihkYywgUG9pbnRzLCAzKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIERGQ1NfTUVOVUJVTExFVDoKICAgICAgICB4ZSA9IG15ci5sZWZ0OwogICAgICAgIHllID0gbXlyLnRvcCAgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKICAgICAgICB4YyA9IG15ci5sZWZ0ICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CiAgICAgICAgeWMgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOwogICAgICAgIGkgPSAyMzQqU21hbGxEaWFtLzc1MDsKICAgICAgICBpID0gaSA8IDEgPyAxIDogaTsKICAgICAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKICAgICAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CiAgICAgICAgbXlyLnRvcCAgICA9IHljIC0gaStpLzI7CiAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOwogICAgICAgIFBpZShkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgREZDU19NRU5VQ0hFQ0s6CiAgICAgICAgUG9pbnRzWzBdLnggPSBteXIubGVmdCArIDI1MypTbWFsbERpYW0vMTAwMDsKICAgICAgICBQb2ludHNbMF0ueSA9IG15ci50b3AgICsgNDQ1KlNtYWxsRGlhbS8xMDAwOwogICAgICAgIFBvaW50c1sxXS54ID0gbXlyLmxlZnQgKyA0MDkqU21hbGxEaWFtLzEwMDA7CiAgICAgICAgUG9pbnRzWzFdLnkgPSBQb2ludHNbMF0ueSArIChQb2ludHNbMV0ueC1Qb2ludHNbMF0ueCk7CiAgICAgICAgUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDY5MCpTbWFsbERpYW0vMTAwMDsKICAgICAgICBQb2ludHNbMl0ueSA9IFBvaW50c1sxXS55IC0gKFBvaW50c1syXS54LVBvaW50c1sxXS54KTsKICAgICAgICBQb2ludHNbM10ueCA9IFBvaW50c1syXS54OwogICAgICAgIFBvaW50c1szXS55ID0gUG9pbnRzWzJdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBQb2ludHNbNF0ueCA9IFBvaW50c1sxXS54OwogICAgICAgIFBvaW50c1s0XS55ID0gUG9pbnRzWzFdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBQb2ludHNbNV0ueCA9IFBvaW50c1swXS54OwogICAgICAgIFBvaW50c1s1XS55ID0gUG9pbnRzWzBdLnkgKyAzKlNtYWxsRGlhbS8xNjsKICAgICAgICBQb2x5Z29uKGRjLCBQb2ludHMsIDYpOwogICAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgV0FSTigiSW52YWxpZCBtZW51OyBmbGFncz0weCUwNHhcbiIsIHVGbGFncyk7CiAgICAgICAgcmV0dmFsID0gRkFMU0U7CiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgU2VsZWN0T2JqZWN0KGRjLCBocHNhdmUpOwogICAgU2VsZWN0T2JqZWN0KGRjLCBoYnNhdmUpOwogICAgcmV0dXJuIHJldHZhbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wxNiAgKFVTRVIuNjU2KQogKi8KQk9PTDE2IFdJTkFQSSBEcmF3RnJhbWVDb250cm9sMTYoIEhEQzE2IGhkYywgTFBSRUNUMTYgcmMsIFVJTlQxNiB1VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB1U3RhdGUgKQp7CiAgICBSRUNUIHJlY3QzMjsKICAgIEJPT0wgcmV0OwoKICAgIENPTlZfUkVDVDE2VE8zMiggcmMsICZyZWN0MzIgKTsKICAgIHJldCA9IERyYXdGcmFtZUNvbnRyb2woIGhkYywgJnJlY3QzMiwgdVR5cGUsIHVTdGF0ZSApOwogICAgQ09OVl9SRUNUMzJUTzE2KCAmcmVjdDMyLCByYyApOwogICAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wzMiAgKFVTRVIzMi4xNTgpCiAqLwpCT09MIFdJTkFQSSBEcmF3RnJhbWVDb250cm9sKCBIREMgaGRjLCBMUFJFQ1QgcmMsIFVJTlQgdVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVTdGF0ZSApCnsKICAgIC8qIFdpbjk1IGRvZXNuJ3Qgc3VwcG9ydCBkcmF3aW5nIGluIG90aGVyIG1hcHBpbmcgbW9kZXMgKi8KICAgIGlmKEdldE1hcE1vZGUoaGRjKSAhPSBNTV9URVhUKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAKICAgIHN3aXRjaCh1VHlwZSkKICAgIHsKICAgIGNhc2UgREZDX0JVVFRPTjoKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVCdXR0b24oaGRjLCByYywgdVN0YXRlKTsKICAgIGNhc2UgREZDX0NBUFRJT046CiAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd0ZyYW1lQ2FwdGlvbihoZGMsIHJjLCB1U3RhdGUpOwogICAgY2FzZSBERkNfTUVOVToKICAgICAgcmV0dXJuIFVJVE9PTFM5NV9EcmF3RnJhbWVNZW51KGhkYywgcmMsIHVTdGF0ZSk7CiAgICBjYXNlIERGQ19TQ1JPTEw6CiAgICAgIHJldHVybiBVSVRPT0xTOTVfRHJhd0ZyYW1lU2Nyb2xsKGhkYywgcmMsIHVTdGF0ZSk7CiAgICBkZWZhdWx0OgogICAgICBXQVJOKCIoJXgsJXAsJWQsJXgpLCBiYWQgdHlwZSFcbiIsCgkgICBoZGMscmMsdVR5cGUsdVN0YXRlICk7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCg==