LyoKICogQklPUyBpbnRlcnJ1cHQgMTBoIGhhbmRsZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqIENvcHlyaWdodCAxOTk4IEpvc2VwaCBQcmFuZXZpY2gKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgojaW5jbHVkZSAiZG9zZXhlLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChpbnQpOwoKc3RhdGljIHZvaWQgc2Nyb2xsX3dpbmRvdyhpbnQgZGlyZWN0aW9uLCBjaGFyIGxpbmVzLCBjaGFyIHJvdzEsCiAgIGNoYXIgY29sMSwgY2hhciByb3cyLCBjaGFyIGNvbDIsIGNoYXIgYXR0cmlidXRlKTsKCiNkZWZpbmUgU0NST0xMX1VQIDEKI2RlZmluZSBTQ1JPTExfRE9XTiAyCgpzdGF0aWMgdm9pZCBCSU9TX0dldEN1cnNvclBvcyhCSU9TREFUQSpkYXRhLHVuc2lnbmVkIHBhZ2UsdW5zaWduZWQqWCx1bnNpZ25lZCpZKQp7CiAgKlggPSBkYXRhLT5WaWRlb0N1cnNvclBvc1twYWdlKjJdOyAgIC8qIGNvbHVtbiAqLwogICpZID0gZGF0YS0+VmlkZW9DdXJzb3JQb3NbcGFnZSoyKzFdOyAvKiByb3cgKi8KfQoKc3RhdGljIHZvaWQgQklPU19TZXRDdXJzb3JQb3MoQklPU0RBVEEqZGF0YSx1bnNpZ25lZCBwYWdlLHVuc2lnbmVkIFgsdW5zaWduZWQgWSkKewogIGRhdGEtPlZpZGVvQ3Vyc29yUG9zW3BhZ2UqMl0gPSBYOwogIGRhdGEtPlZpZGVvQ3Vyc29yUG9zW3BhZ2UqMisxXSA9IFk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIERPU1ZNX0luaXRpYWxpemVWaWRlb01vZGUKICoKICogVGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgVkdBIGVtdWxhdGlvbiBpcyBzZXQgdG8gdGhlCiAqIGRlZmF1bHQgdGV4dCBtb2RlLgogKi8Kc3RhdGljIHZvaWQgRE9TVk1fSW5pdGlhbGl6ZVZpZGVvTW9kZSggQklPU0RBVEEgKmRhdGEgKQp7CiAgc3RhdGljIEJPT0wgYWxyZWFkeV9pbml0aWFsaXplZCA9IEZBTFNFOwogIHVuc2lnbmVkICAgIHdpZHRoOwogIHVuc2lnbmVkICAgIGhlaWdodDsKCiAgaWYoYWxyZWFkeV9pbml0aWFsaXplZCkKICAgIHJldHVybjsKICBhbHJlYWR5X2luaXRpYWxpemVkID0gVFJVRTsKCiAgVkdBX0luaXRBbHBoYU1vZGUoJndpZHRoLCAmaGVpZ2h0KTsKCiAgLyoKICAgKiBGSVhNRTogQWRkIG1vcmUgbWFwcGluZ3MgYmV0d2VlbiBpbml0aWFsIHNpemUgYW5kCiAgICogICAgICAgIHRleHQgbW9kZXMuCiAgICovCiAgaWYgKHdpZHRoID49IDgwICYmIGhlaWdodCA+PSAyNSkgewogICAgVkdBX1NldEFscGhhTW9kZSg4MCwgMjUpOwogICAgZGF0YS0+VmlkZW9Db2x1bW5zID0gODA7CiAgICBkYXRhLT5WaWRlb01vZGUgPSAweDAzOwogIH0gZWxzZSB7CiAgICBWR0FfU2V0QWxwaGFNb2RlKDQwLCAyNSk7CiAgICBkYXRhLT5WaWRlb0NvbHVtbnMgPSA0MDsKICAgIGRhdGEtPlZpZGVvTW9kZSA9IDB4MDE7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJICAgIERPU1ZNX0ludDEwSGFuZGxlciAoV1BST0NTLjExNikKICoJICAgIERPU1ZNX0ludDEwSGFuZGxlciAoV0lORURPUzE2LjExNikKICoKICogSGFuZGxlciBmb3IgaW50IDEwaCAodmlkZW8pLgogKgogKiBOT1RFOgogKiAgICBNb3N0IElOVCAxMCBmdW5jdGlvbnMgZm9yIHRleHQtbW9kZSwgQ0dBLCBFR0EsIGFuZCBWR0EgY2FyZHMKICogICAgYXJlIHByZXNlbnQgaW4gdGhpcyBsaXN0LiAoU1ZHQSBhbmQgWEdBIGFyZSBub3QpIFRoYXQgaXMgbm90CiAqICAgIHRvIHNheSB0aGF0IGFsbCB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHN1cHBvcnRlZCwgYnV0IGlmCiAqICAgIGFueW9uZSBpcyBicmFpbi1kYW1hZ2VkIGVub3VnaCB0byB3YW50IHRvIGVtdWxhdGUgb25lIG9mIHRoZXNlCiAqICAgIGJlYXN0cyB0aGVuIHRoaXMgc2hvdWxkIGdldCB5b3Ugc3RhcnRlZC4KICoKICogTk9URToKICogICAgU2V2ZXJhbCBjb21tb24gZ3JhcGhpY2FsIGV4dGVuc2lvbnMgdXNlZCBieSBNaWNyb3NvZnQgaG9vawogKiAgICBvZmYgb2YgaGVyZS4gSSBoYXZlICpub3QqIGFkZGVkIHRoZW0gdG8gdGhpcyBsaXN0ICh5ZXQpLiBUaGV5CiAqICAgIGluY2x1ZGU6CiAqCiAqICAgIE1TSEVSQy5DT00gLSBNb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIEhlcmN1bGVzIGNhcmRzLgogKiAgICBFR0EuU1lTIChhbHNvIE1PVVNFLkNPTSkgLSBNb3JlIGZvciBFR0EgY2FyZHMuCiAqCiAqICAgIFllcywgTVMgYWxzbyBhZGRlZCB0aGlzIHN1cHBvcnQgaW50byB0aGVpciBtb3VzZSBkcml2ZXIuIERvbid0CiAqICAgIGFzayBtZSwgSSBkb24ndCB3b3JrIGZvciB0aGVtLgogKgogKiBKb3NlcGggUHJhbmV2aWNoIC0gOS85OAogKgogKiAgSmVzcyBIYWFzIDIvOTkKICoJQWRkZWQgc3VwcG9ydCBmb3IgVmVzYS4gSXQgaXMgbm90IGNvbXBsZXRlIGJ1dCBpcyBhIHN0YXJ0LgogKglOT1RFOiBJbSBub3Qgc3VyZSBpZiBpIGRpZCBhbGwgdGhpcyByaWdodCBvciBpZiBlbnkgb2YgaXQgd29ya3MuCiAqCUN1cnJlbnRseSBpIGRvbnQgaGF2ZSBhIHByb2dyYW0gdGhhdCB1c2VzIFZlc2EgdGhhdCBhY3R1YWxseSBnZXRzIGZhcgogKgllbm91Z2ggd2l0aG91dCBjcmFzaGluZyB0byBkbyB2ZXNhIHN0dWZmLgogKgogKiAgICAgIEFkZGVkIGFkZGl0aW9uYWwgdmdhIGdyYXBoaWMgc3VwcG9ydCAtIDMvOTkKICovCgpzdGF0aWMgdm9pZCBET1NWTV9JbnQxMEhhbmRsZXJfVkVTQSggQ09OVEVYVDg2ICpjb250ZXh0ICkKewogICAgQklPU0RBVEEgKmRhdGEgPSBCSU9TX0RBVEE7CgogICAgc3dpdGNoKEFMX3JlZyhjb250ZXh0KSkgewoKICAgIGNhc2UgMHgwMDogLyogR0VUIFN1cGVyVkdBIElORk9STUFUSU9OICovCiAgICAgICAgVFJBQ0UoIlZFU0EgR0VUIFN1cGVyVkdBIElORk9STUFUSU9OXG4iKTsKICAgICAgICBtZW1jcHkoQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsY29udGV4dC0+U2VnRXMsY29udGV4dC0+RWRpKSwKICAgICAgICAgICAgICAgJkJJT1NfRVhUUkFfUFRSLT52ZXNhX2luZm8sIHNpemVvZihWRVNBSU5GTykpOwogICAgICAgIFNFVF9BTCggY29udGV4dCwgMHg0ZiApOwogICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiAweDAwID0gc3VjY2Vzc2Z1bCAweDAxID0gZmFpbGVkICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDAxOiAvKiBHRVQgU3VwZXJWR0EgTU9ERSBJTkZPUk1BVElPTiAqLwogICAgICAgIEZJWE1FKCJWRVNBIEdFVCBTdXBlclZHQSBNb2RlIEluZm9ybWF0aW9uIC0gTm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgU0VUX0FMKCBjb250ZXh0LCAweDRmICk7CiAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAxICk7IC8qIDB4MDAgPSBzdWNjZXNzZnVsIDB4MDEgPSBmYWlsZWQgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDI6IC8qIFNFVCBTdXBlclZHQSBWSURFTyBNT0RFICovCiAgICAgICAgc3dpdGNoKEJYX3JlZyhjb250ZXh0KSkgewogICAgICAgICAgICAvKiBPRU0gVmlkZW8gTW9kZXMgKi8KICAgICAgICBjYXNlIDB4MDA6IC8qIDQweDI1ICovCiAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICBUUkFDRSgiU2V0IFZFU0EgVGV4dCBNb2RlIC0gMHgwJXhcbiIsCiAgICAgICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIFZHQV9TZXRBbHBoYU1vZGUoNDAsIDI1KTsKICAgICAgICAgICAgZGF0YS0+VmlkZW9Db2x1bW5zID0gNDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMjoKICAgICAgICBjYXNlIDB4MDM6CiAgICAgICAgY2FzZSAweDA3OgogICAgICAgICAgICBUUkFDRSgiU2V0IFZFU0EgVGV4dCBNb2RlIC0gMHgwJXhcbiIsCiAgICAgICAgICAgICAgICAgIEJYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIFZHQV9TZXRBbHBoYU1vZGUoODAsIDI1KTsKICAgICAgICAgICAgZGF0YS0+VmlkZW9Db2x1bW5zID0gODA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwRDoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAzMjB4MjAwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSgzMjAsMjAwLDQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MEU6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgNjQweDIwMCAxNi1jb2xvciBtb2RlXG4iKTsKICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDIwMCw0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDEwOgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHgzNTAgMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDY0MCwzNTAsNCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMjoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSA2NDB4NDgwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSg2NDAsNDgwLDQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTM6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMzIweDIwMCAyNTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDMyMCwyMDAsOCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvKiBWQkUgTW9kZXMgKi8KICAgICAgICBjYXNlIDB4MTAwOgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHg0MDAgMjU2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSg2NDAsNDAwLDgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTAxOgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHg0ODAgMjU2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSg2NDAsNDgwLDgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTAyOgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDgwMHg2MDAgMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDgwMCw2MDAsNCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMDM6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgODAweDYwMCAyNTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDgwMCw2MDAsOCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMDQ6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTAyNHg3NjggMTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDEwMjQsNzY4LDQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTA1OgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDEwMjR4NzY4IDI1Ni1jb2xvciBtb2RlXG4iKTsKICAgICAgICAgICAgVkdBX1NldE1vZGUoMTAyNCw3NjgsOCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMDY6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTI4MHgxMDI0IDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSgxMjgwLDEwMjQsNCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMDc6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTI4MHgxMDI0IDI1Ni1jb2xvciBtb2RlXG4iKTsKICAgICAgICAgICAgVkdBX1NldE1vZGUoMTI4MCwxMDI0LDgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLyogMTA4aCAtIDEwQ2ggYXJlIHRleHQgbW9kZXMgYW5kIGltIGxhenkgc28gOnAgKi8KICAgICAgICAgICAgLyogVkJFIHYxLjIrICovCiAgICAgICAgY2FzZSAweDEwRDoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAzMjB4MjAwIDE1YnBwXG4iKTsKICAgICAgICAgICAgVkdBX1NldE1vZGUoMzIwLDIwMCwxNSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMEU6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMzIweDIwMCAxNmJwcFxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDMyMCwyMDAsMTYpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTBGOgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDMyMHgyMDAgMjRicHBcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSgzMjAsMjAwLDI0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDExMDoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSA2NDB4NDgwIDE1YnBwXG4iKTsKICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDQ4MCwxNSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMTE6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgNjQweDQ4MCAxNmJwcFxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDY0MCw0ODAsMTYpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTEyOgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDY0MHg0ODAgMjRicHBcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSg2NDAsNDgwLDI0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDExMzoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSA4MDB4NjAwIDE1YnBwXG4iKTsKICAgICAgICAgICAgVkdBX1NldE1vZGUoODAwLDYwMCwxNSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMTQ6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgODAweDYwMCAxNmJwcFxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDgwMCw2MDAsMTYpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTE1OgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDgwMHg2MDAgMjRicHBcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSg4MDAsNjAwLDI0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDExNjoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAxMDI0eDc2OCAxNWJwcFxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDEwMjQsNzY4LDE1KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDExNzoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAxMDI0eDc2OCAxNmJwcFxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDEwMjQsNzY4LDE2KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDExODoKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAxMDI0eDc2OCAyNGJwcFxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDEwMjQsNzY4LDI0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDExOToKICAgICAgICAgICAgVFJBQ0UoIlNldHRpbmcgVkVTQSAxMjgweDEwMjQgMTVicHBcbiIpOwogICAgICAgICAgICBWR0FfU2V0TW9kZSgxMjgwLDEwMjQsMTUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTFBOgogICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWRVNBIDEyODB4MTAyNCAxNmJwcFxuIik7CiAgICAgICAgICAgIFZHQV9TZXRNb2RlKDEyODAsMTAyNCwxNik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxMUI6CiAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZFU0EgMTI4MHgxMDI0IDI0YnBwXG4iKTsKICAgICAgICAgICAgVkdBX1NldE1vZGUoMTI4MCwxMDI0LDI0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIlZFU0EgU2V0IFZpZGVvIE1vZGUgKDB4JXgpIC0gTm90IFN1cHBvcnRlZFxuIiwgQlhfcmVnKGNvbnRleHQpKTsKICAgICAgICB9CiAgICAgICAgZGF0YS0+VmlkZW9Nb2RlID0gQlhfcmVnKGNvbnRleHQpOwogICAgICAgIFNFVF9BTCggY29udGV4dCwgMHg0ZiApOwogICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwMzogLyogVkVTQSBTdXBlclZHQSBCSU9TIC0gR0VUIENVUlJFTlQgVklERU8gTU9ERSAqLwogICAgICAgIFNFVF9BTCggY29udGV4dCwgMHg0ZiApOwogICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiBzaG91bGQgcHJvYmx5IGNoZWNrIGlmIGEgdmVzYSBtb2RlIGhhcyBiZW4gc2V0ICovCiAgICAgICAgU0VUX0JYKCBjb250ZXh0LCBkYXRhLT5WaWRlb01vZGUgKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDQ6IC8qIFZFU0EgU3VwZXJWR0EgQklPUyAtIFNBVkUvUkVTVE9SRSBTdXBlclZHQSBWSURFTyBTVEFURSAqLwogICAgICAgIEVSUigiVkVTQSBTQVZFL1JFU1RPUkUgVmlkZW8gU3RhdGUgLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwogICAgICAgIC8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCiAgICAgICAgLyogbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgaW5zdGVhZCA/ICovCiAgICAgICAgLyogQUhfcmVnKGNvbnRleHQgPSAweDAxOyAgbm90IGltcGxlbWVudGVkIHNvIGp1c3QgZmFpbCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNTogLyogVkVTQSBTdXBlclZHQSBCSU9TIC0gQ1BVIFZJREVPIE1FTU9SWSBDT05UUk9MICovCiAgICAgICAgLyoKICAgICAgICAgKiBUaGlzIHN1YmZ1bmN0aW9uIHN1cHBvcnRzIG9ubHkgV2luZG93IEEgKEJMX3JlZyA9PSAwKSBhbmQKICAgICAgICAgKiBpcyBhc3N1bWVzIHRoYXQgd2luZG93IGdyYW51bGFyaXR5IGlzIDY0ay4KICAgICAgICAgKi8KICAgICAgICBzd2l0Y2goQkhfcmVnKGNvbnRleHQpKSB7CiAgICAgICAgY2FzZSAweDAwOiAvKiBzZWxlY3QgdmlkZW8gbWVtb3J5IHdpbmRvdyAqLwogICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4NGYgKTsgLyogZnVuY3Rpb24gc3VwcG9ydGVkICovCiAgICAgICAgICAgIGlmKEJMX3JlZyhjb250ZXh0KSA9PSAwKSB7CiAgICAgICAgICAgICAgICBWR0FfU2V0V2luZG93U3RhcnQoRFhfcmVnKGNvbnRleHQpICogNjQgKiAxMDI0KTsKICAgICAgICAgICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiBzdGF0dXM6IHN1Y2Nlc3NmdWwgKi8KICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDEgKTsgLyogc3RhdHVzOiBmYWlsZWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBnZXQgdmlkZW8gbWVtb3J5IHdpbmRvdyAqLwogICAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4NGYgKTsgLyogZnVuY3Rpb24gc3VwcG9ydGVkICovCiAgICAgICAgICAgIGlmKEJMX3JlZyhjb250ZXh0KSA9PSAwKSB7CiAgICAgICAgICAgICAgICBTRVRfRFgoIGNvbnRleHQsIFZHQV9HZXRXaW5kb3dTdGFydCgpIC8gNjQgLyAxMDI0ICk7CiAgICAgICAgICAgICAgICBTRVRfQUgoIGNvbnRleHQsIDB4MDAgKTsgLyogc3RhdHVzOiBzdWNjZXNzZnVsICovCiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCAweDAxICk7IC8qIHN0YXR1czogZmFpbGVkICovCiAgICAgICAgICAgIGJyZWFrOwoJZGVmYXVsdDoKICAgICAgICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MTAgKTsKCX0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDY6IC8qIFZFU0EgR0VUL1NFVCBMT0dJQ0FMIFNDQU4gTElORSBMRU5HVEggKi8KICAgICAgICBFUlIoIlZFU0EgR0VUL1NFVCBMT0dJQ0FMIFNDQU4gTElORSBMRU5HVEggLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwogICAgICAgIC8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCiAgICAgICAgLyogbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgaW5zdGVhZCA/ICovCiAgICAgICAgLyogQUhfcmVnKGNvbnRleHQgPSAweDAwMTsgbm90IGltcGxlbWVudGVkIHNvIGp1c3QgZmFpbCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNzogLyogR0VUL1NFVCBESVNQTEFZIFNUQVJUICovCiAgICAgICAgRVJSKCJWRVNBIEdFVC9TRVQgRElTUExBWSBTVEFSVCAtIE5vdCBJbXBsZW1lbnRlZFxuIik7CiAgICAgICAgLyogQUxfcmVnKGNvbnRleHQpID0gMHg0ZjsgPSBzdXBwb3J0ZWQgc28gbm90IHNldCBzaW5jZSBub3QgaW1wbGVtZW50ZWQgKi8KICAgICAgICAvKiBtYXliZSB3ZSBzaG91bGQgZG8gdGhpcyBpbnN0ZWFkID8gKi8KICAgICAgICAvKiBBSF9yZWcoY29udGV4dCA9IDB4MDAxOyBub3QgaW1wbGVtZW50ZWQgc28ganVzdCBmYWlsICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA4OiAvKiBHRVQvU0VUIERBQyBQQUxFVFRFIENPTlRST0wgKi8KICAgICAgICBFUlIoIlZFU0EgR0VUL1NFVCBEQUMgUEFMRVRURSBDT05UUk9MLSBOb3QgSW1wbGVtZW50ZWRcbiIpOwogICAgICAgIC8qIEFMX3JlZyhjb250ZXh0KSA9IDB4NGY7ID0gc3VwcG9ydGVkIHNvIG5vdCBzZXQgc2luY2Ugbm90IGltcGxlbWVudGVkICovCiAgICAgICAgLyogbWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXMgaW5zdGVhZCA/ICovCiAgICAgICAgLyogQUhfcmVnKGNvbnRleHQgPSAweDAwMTsgbm90IGltcGxlbWVudGVkIHNvIGp1c3QgZmFpbCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwOTogLyogU0VUIFBBTEVUVEUgRU5UUklFUyAqLwogICAgICAgIEZJWE1FKCJWRVNBIFNldCBwYWxldHRlIGVudHJpZXMgLSBub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYTogLyogR0VUIFBST1RFQ1RFRC1NT0RFIENPREUgKi8KICAgICAgICBGSVhNRSgiVkVTQSBHZXQgcHJvdGVjdGVkLW1vZGUgY29kZSAtIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDEwOiAvKiBEaXNwbGF5IFBvd2VyIE1hbmFnZW1lbnQgRXh0ZW5zaW9ucyAqLwogICAgICAgIEZJWE1FKCJWRVNBIERpc3BsYXkgUG93ZXIgTWFuYWdlbWVudCBFeHRlbnNpb25zIC0gbm90IGltcGxlbWVudGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4ZWY6ICAvKiBnZXQgdmlkZW8gbW9kZSBmb3IgaGVyY3VsZXMtY29tcGF0aWJsZXMgICAqLwogICAgICAgIC8qIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHJlYWxseSBzdXBwb3J0IHRoaXMgICovCiAgICAgICAgLyogaXMgdGhlcmU/Li4uLi4uLi4uLi4uLi4uLi4uLi4oQS5DLikgICAgICAgKi8KICAgICAgICBUUkFDRSgiSnVzdCByZXBvcnQgdGhlIHZpZGVvIG5vdCBoZXJjdWxlcyBjb21wYXRpYmxlXG4iKTsKICAgICAgICBTRVRfRFgoIGNvbnRleHQsIDB4ZmZmZiApOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHhmZjogLyogVHVybiBWRVNBIE9OL09GRiAqLwogICAgICAgIC8qIGkgZG9udCBrbm93IHdoYXQgdG8gZG8gKi8KICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJWRVNBIEZ1bmN0aW9uICgweCV4KSAtIE5vdCBTdXBwb3J0ZWRcbiIsIEFIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBXSU5BUEkgRE9TVk1fSW50MTBIYW5kbGVyKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiAgICBCSU9TREFUQSAqZGF0YSA9IEJJT1NfREFUQTsKCiAgICBET1NWTV9Jbml0aWFsaXplVmlkZW9Nb2RlKCBkYXRhICk7CgogICAgc3dpdGNoKEFIX3JlZyhjb250ZXh0KSkgewoKICAgIGNhc2UgMHgwMDogLyogU0VUIFZJREVPIE1PREUgKi8KICAgICAgICAvKiBUZXh0IE1vZGVzOiAqLwogICAgICAgIC8qIChtb2RlKSAodGV4dCByb3dzL2NvbHMpCiAgICAgICAgICAgIDB4MDAgLSA0MHgyNQogICAgICAgICAgICAweDAxIC0gNDB4MjUKICAgICAgICAgICAgMHgwMiAtIDgweDI1CiAgICAgICAgICAgIDB4MDMgLSA4MHgyNSBvciA4MHg0MyBvciA4MHg1MCAoYXNzdW1lIDgweDI1KQogICAgICAgICAgICAweDA3IC0gODB4MjUKICAgICAgICAqLwoKICAgICAgICAvKiBCaXQgNyBvZiBBSCA9IDAgLT4gQ2xlYW4gdGhlIHZpZGVvIG1lbW9yeQogICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiBEb24ndCBjbGVhbiBpdAogICAgICAgICovCiAgICAgICAgaWYgKCEoQUxfcmVnKGNvbnRleHQpJjB4ODApKSB7CgkgICAgLyogRklYTUU6IERvIHNvbWV0aGluZyB3aGljaCBjbGVhbnMgdGhlIHZpZGVvIG1lbW9yeSAqLwogICAgICAgIH0KCiAgICAgICAgLyogRklYTUU6IFNob3VsZCB3ZSBrZWVwIHRoZSBiaXQgNyBpbiB0aGUgQmlvcyBEYXRhIG1lbW9yeT8gKi8KICAgICAgICBjb250ZXh0LT5FYXggJj0gfjB4ODA7CgogICAgICAgIHN3aXRjaCAoQUxfcmVnKGNvbnRleHQpKSB7CiAgICAgICAgICAgIGNhc2UgMHgwMDogLyogNDB4MjUgKi8KICAgICAgICAgICAgY2FzZSAweDAxOgogICAgICAgICAgICAgICAgVFJBQ0UoIlNldCBWaWRlbyBNb2RlIC0gU2V0IHRvIFRleHQgLSAweDAleFxuIiwKICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICAgICBWR0FfU2V0QWxwaGFNb2RlKDQwLCAyNSk7CiAgICAgICAgICAgICAgICBkYXRhLT5WaWRlb0NvbHVtbnMgPSA0MDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MDI6CiAgICAgICAgICAgIGNhc2UgMHgwMzoKICAgICAgICAgICAgY2FzZSAweDA3OgogICAgICAgICAgICAgICAgVFJBQ0UoIlNldCBWaWRlbyBNb2RlIC0gU2V0IHRvIFRleHQgLSAweDAleFxuIiwKICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgICAgICBWR0FfU2V0QWxwaGFNb2RlKDgwLCAyNSk7CiAgICAgICAgICAgICAgICBkYXRhLT5WaWRlb0NvbHVtbnMgPSA4MDsKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIGNhc2UgMHgwRDoKICAgICAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZHQSAzMjB4MjAwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoMzIwLDIwMCw0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIGNhc2UgMHgwRToKICAgICAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZHQSA2NDB4MjAwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDIwMCw0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIGNhc2UgMHgxMDoKICAgICAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZHQSA2NDB4MzUwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDM1MCw0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJICAgIGNhc2UgMHgxMjoKICAgICAgICAgICAgICAgIFRSQUNFKCJTZXR0aW5nIFZHQSA2NDB4NDgwIDE2LWNvbG9yIG1vZGVcbiIpOwogICAgICAgICAgICAgICAgVkdBX1NldE1vZGUoNjQwLDQ4MCw0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDB4MTM6CiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0dGluZyBWR0EgMzIweDIwMCAyNTYtY29sb3IgbW9kZVxuIik7CiAgICAgICAgICAgICAgICBWR0FfU2V0TW9kZSgzMjAsMjAwLDgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBGSVhNRSgiU2V0IFZpZGVvIE1vZGUgKDB4JXgpIC0gTm90IFN1cHBvcnRlZFxuIiwKICAgICAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgfQogICAgICAgIGRhdGEtPlZpZGVvTW9kZSA9IEFMX3JlZyhjb250ZXh0KTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDE6IC8qIFNFVCBDVVJTT1IgU0hBUEUgKi8KICAgICAgICBUUkFDRSgiU2V0IEN1cnNvciBTaGFwZSBzdGFydCAlZCBlbmQgJWQgb3B0aW9ucyAlZFxuIiwKICAgICAgICAgICAgICBDSF9yZWcoY29udGV4dCkgJiAweDFmLAogICAgICAgICAgICAgIENMX3JlZyhjb250ZXh0KSAmIDB4MWYsCiAgICAgICAgICAgICAgQ0hfcmVnKGNvbnRleHQpICYgMHhlMCk7CiAgICAgICAgZGF0YS0+VmlkZW9DdXJzb3JUeXBlID0gQ1hfcmVnKGNvbnRleHQpOyAvKiBkaXJlY3QgY29weSAqLwoJVkdBX1NldEN1cnNvclNoYXBlKENIX3JlZyhjb250ZXh0KSwgQ0xfcmVnKGNvbnRleHQpKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDI6IC8qIFNFVCBDVVJTT1IgUE9TSVRJT04gKi8KICAgICAgICAvKiBCSCA9IFBhZ2UgTnVtYmVyICovIC8qIE5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAvKiBESCA9IFJvdyAqLyAvKiAwIGlzIGxlZnQgKi8KICAgICAgICAvKiBETCA9IENvbHVtbiAqLyAvKiAwIGlzIHRvcCAqLwogICAgICAgIEJJT1NfU2V0Q3Vyc29yUG9zKGRhdGEsQkhfcmVnKGNvbnRleHQpLERMX3JlZyhjb250ZXh0KSxESF9yZWcoY29udGV4dCkpOwogICAgICAgIGlmIChCSF9yZWcoY29udGV4dCkpCiAgICAgICAgewogICAgICAgICAgIEZJWE1FKCJTZXQgQ3Vyc29yIFBvc2l0aW9uOiBDYW5ub3Qgc2V0IHRvIHBhZ2UgJWRcbiIsCiAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICBWR0FfU2V0Q3Vyc29yUG9zKERMX3JlZyhjb250ZXh0KSwgREhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICBUUkFDRSgiU2V0IEN1cnNvciBQb3NpdGlvbjogJWQvJWRcbiIsIERMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICAgICBESF9yZWcoY29udGV4dCkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDM6IC8qIEdFVCBDVVJTT1IgUE9TSVRJT04gQU5EIFNJWkUgKi8KICAgICAgICB7CiAgICAgICAgICB1bnNpZ25lZCByb3csIGNvbDsKCiAgICAgICAgICBUUkFDRSgiR2V0IGN1cnNvciBwb3NpdGlvbiBhbmQgc2l6ZSAocGFnZSAlZClcbiIsIEJIX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICBTRVRfQ1goIGNvbnRleHQsIGRhdGEtPlZpZGVvQ3Vyc29yVHlwZSApOwogICAgICAgICAgQklPU19HZXRDdXJzb3JQb3MoZGF0YSxCSF9yZWcoY29udGV4dCksJmNvbCwmcm93KTsKICAgICAgICAgIFNFVF9ESCggY29udGV4dCwgcm93ICk7CiAgICAgICAgICBTRVRfREwoIGNvbnRleHQsIGNvbCApOwogICAgICAgICAgVFJBQ0UoIkN1cnNvciBQb3NpdGlvbjogJWQvJWRcbiIsIERMX3JlZyhjb250ZXh0KSwgREhfcmVnKGNvbnRleHQpKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA0OiAvKiBSRUFEIExJR0hUIFBFTiBQT1NJVElPTiAqLwogICAgICAgIEZJWE1FKCJSZWFkIExpZ2h0IFBlbiBQb3NpdGlvbiAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgIFNFVF9BSCggY29udGV4dCwgMHgwMCApOyAvKiBOb3QgZG93biAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNTogLyogU0VMRUNUIEFDVElWRSBESVNQTEFZIFBBR0UgKi8KICAgICAgICBGSVhNRSgiU2VsZWN0IEFjdGl2ZSBEaXNwbGF5IFBhZ2UgKCVkKSAtIE5vdCBTdXBwb3J0ZWRcbiIsIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgZGF0YS0+VmlkZW9DdXJQYWdlID0gQUxfcmVnKGNvbnRleHQpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwNjogLyogU0NST0xMIFVQIFdJTkRPVyAqLwogICAgICAgIC8qIEFMID0gTGluZXMgdG8gc2Nyb2xsICovCiAgICAgICAgLyogQkggPSBBdHRyaWJ1dGUgKi8KICAgICAgICAvKiBDSCxDTCA9IHJvdywgY29sIHVwcGVyLWxlZnQgKi8KICAgICAgICAvKiBESCxETCA9IHJvdywgY29sIGxvd2VyLXJpZ2h0ICovCiAgICAgICAgc2Nyb2xsX3dpbmRvdyhTQ1JPTExfVVAsIEFMX3JlZyhjb250ZXh0KSwgQ0hfcmVnKGNvbnRleHQpLAogICAgICAgICAgIENMX3JlZyhjb250ZXh0KSwgREhfcmVnKGNvbnRleHQpLCBETF9yZWcoY29udGV4dCksCiAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICBUUkFDRSgiU2Nyb2xsIFVwIFdpbmRvdyAlZFxuIiwgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MDc6IC8qIFNDUk9MTCBET1dOIFdJTkRPVyAqLwogICAgICAgIC8qIEFMID0gTGluZXMgdG8gc2Nyb2xsICovCiAgICAgICAgLyogQkggPSBBdHRyaWJ1dGUgKi8KICAgICAgICAvKiBDSCxDTCA9IHJvdywgY29sIHVwcGVyLWxlZnQgKi8KICAgICAgICAvKiBESCxETCA9IHJvdywgY29sIGxvd2VyLXJpZ2h0ICovCiAgICAgICAgc2Nyb2xsX3dpbmRvdyhTQ1JPTExfRE9XTiwgQUxfcmVnKGNvbnRleHQpLCBDSF9yZWcoY29udGV4dCksCiAgICAgICAgICAgQ0xfcmVnKGNvbnRleHQpLCBESF9yZWcoY29udGV4dCksIERMX3JlZyhjb250ZXh0KSwKICAgICAgICAgICBCSF9yZWcoY29udGV4dCkpOwogICAgICAgIFRSQUNFKCJTY3JvbGwgRG93biBXaW5kb3cgJWRcbiIsIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA4OiAvKiBSRUFEIENIQVJBQ1RFUiBBTkQgQVRUUklCVVRFIEFUIENVUlNPUiBQT1NJVElPTiAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKEJIX3JlZyhjb250ZXh0KSkgLyogV3JpdGUgdG8gZGlmZmVyZW50IHBhZ2UgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRklYTUUoIlJlYWQgY2hhcmFjdGVyIGFuZCBhdHRyaWJ1dGUgYXQgY3Vyc29yIHBvc2l0aW9uIC0iCiAgICAgICAgICAgICAgICAgICAgICAiIENhbid0IHJlYWQgZnJvbSBub24tMCBwYWdlXG4iKTsKICAgICAgICAgICAgICAgIFNFVF9BTCggY29udGV4dCwgJyAnICk7IC8qIFRoYXQgcGFnZSBpcyBibGFuayAqLwogICAgICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCA3ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEJZVEUgYXNjaWksIGF0dHI7CiAgICAgICAgICAgICAgICBUUkFDRSgiUmVhZCBDaGFyYWN0ZXIgYW5kIEF0dHJpYnV0ZSBhdCBDdXJzb3IgUG9zaXRpb25cbiIpOwogICAgICAgICAgICAgICAgVkdBX0dldENoYXJhY3RlckF0Q3Vyc29yKCZhc2NpaSwgJmF0dHIpOwogICAgICAgICAgICAgICAgU0VUX0FMKCBjb250ZXh0LCBhc2NpaSApOwogICAgICAgICAgICAgICAgU0VUX0FIKCBjb250ZXh0LCBhdHRyICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDA5OiAvKiBXUklURSBDSEFSQUNURVIgQU5EIEFUVFJJQlVURSBBVCBDVVJTT1IgUE9TSVRJT04gKi8KICAgIGNhc2UgMHgwYTogLyogV1JJVEUgQ0hBUkFDVEVSIE9OTFkgQVQgQ1VSU09SIFBPU0lUSU9OICovCiAgICAgICAvKiBBTCA9IENoYXJhY3RlciB0byBkaXNwbGF5LiAqLwogICAgICAgLyogQkggPSBQYWdlIE51bWJlciAqLyAvKiBXZSBjYW4ndCB3cml0ZSB0byBub24tMCBwYWdlcywgeWV0LiAqLwogICAgICAgLyogQkwgPSBBdHRyaWJ1dGUgLyBDb2xvciAqLwogICAgICAgLyogQ1ggPSBUaW1lcyB0byBXcml0ZSBDaGFyICovCiAgICAgICAvKiBOb3RlIGhlcmUgdGhhdCB0aGUgY3Vyc29yIGlzIG5vdCBhZHZhbmNlZC4gKi8KICAgICAgIHsKICAgICAgICAgICB1bnNpZ25lZCByb3csIGNvbDsKCiAgICAgICAgICAgQklPU19HZXRDdXJzb3JQb3MoZGF0YSxCSF9yZWcoY29udGV4dCksJmNvbCwmcm93KTsKICAgICAgICAgICBWR0FfV3JpdGVDaGFycyhjb2wsIHJvdywKICAgICAgICAgICAgICAgICAgICAgICAgICBBTF9yZWcoY29udGV4dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKEFIX3JlZyhjb250ZXh0KSA9PSAweDA5KSA/IEJMX3JlZyhjb250ZXh0KSA6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgIENYX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgaWYgKENYX3JlZyhjb250ZXh0KSA+IDEpCiAgICAgICAgICAgICAgVFJBQ0UoIldyaXRlIENoYXJhY3RlciVzIGF0IEN1cnNvciBQb3NpdGlvbiAoUmVwLiAlZCk6ICVjXG4iLAogICAgICAgICAgICAgICAgICAgIChBSF9yZWcoY29udGV4dCkgPT0gMHgwOSkgPyAiIGFuZCBBdHRyaWJ1dGUiIDogIiIsCiAgICAgICAgICAgICAgICAgQ1hfcmVnKGNvbnRleHQpLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBUUkFDRSgiV3JpdGUgQ2hhcmFjdGVyJXMgYXQgQ3Vyc29yIFBvc2l0aW9uOiAlY1xuIiwKICAgICAgICAgICAgICAgICAgICAoQUhfcmVnKGNvbnRleHQpID09IDB4MDkpID8gIiBhbmQgQXR0cmlidXRlIiA6ICIiLAogICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYjoKICAgICAgICBzd2l0Y2ggQkhfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIFNFVCBCQUNLR1JPVU5EL0JPUkRFUiBDT0xPUiAqLwogICAgICAgICAgICAvKiBJbiB0ZXh0IG1vZGVzLCB0aGlzIHNldHMgb25seSB0aGUgYm9yZGVyLi4uICovCiAgICAgICAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgaW50ZXJydXB0IGxpc3QgYW5kIG9uZSBvZiBteSBib29rcy4gKi8KICAgICAgICAgICAgLyogRnVubnkgdGhvdWdoIHRoYXQgQmV5b25kIFpvcmsgc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCBpdAogICAgICAgICAgICAgICBhbHNvIHNldHMgdXAgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBhdHRyaWJ1dGVzIGZvciBjbGVhcnMKICAgICAgICAgICAgICAgYW5kIHNjcm9sbHMuLi4gKi8KICAgICAgICAgICAgLyogQmVhciBpbiBtaW5kIGhlcmUgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UsCiAgICAgICAgICAgICAgIGFwcGFyZW50bHksIHRoZSBmb3JlZ3JvdW5kIG9yIGF0dHJpYnV0ZSBvZiB0aGUgYmFja2dyb3VuZAogICAgICAgICAgICAgICB3aXRoIHRoaXMgY2FsbCwgc28gd2Ugc2hvdWxkIGNoZWNrIGZpcnN0IHRvIHNlZSB3aGF0IHRoZQogICAgICAgICAgICAgICBmb3JlZ3JvdW5kIGFscmVhZHkgaXMuLi4gRklYTUUgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBCYWNrZ3JvdW5kL0JvcmRlciBDb2xvcjogJWQvJWRcbiIsCiAgICAgICAgICAgICAgIEJIX3JlZyhjb250ZXh0KSwgQkxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBTRVQgUEFMRVRURSAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IFBhbGV0dGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MGIgQkggPSAweCV4IC0gVW5rbm93blxuIiwKICAgICAgICAgICAgICAgQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwYzogLyogV1JJVEUgR1JBUEhJQ1MgUElYRUwgKi8KICAgICAgICAvKiBOb3QgaW4gZ3JhcGhpY3MgbW9kZSwgY2FuIGlnbm9yZSB3L28gZXJyb3IgKi8KICAgICAgICBGSVhNRSgiV3JpdGUgR3JhcGhpY3MgUGl4ZWwgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MGQ6IC8qIFJFQUQgR1JBUEhJQ1MgUElYRUwgKi8KICAgICAgICAvKiBOb3QgaW4gZ3JhcGhpY3MgbW9kZSwgY2FuIGlnbm9yZSB3L28gZXJyb3IgKi8KICAgICAgICBGSVhNRSgiUmVhZCBHcmFwaGljcyBQaXhlbCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwZTogLyogVEVMRVRZUEUgT1VUUFVUICovCiAgICAgICAgVFJBQ0UoIlRlbGV0eXBlIE91dHB1dFxuIik7CiAgICAgICAgRE9TVk1fUHV0Q2hhcihBTF9yZWcoY29udGV4dCkpOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgwZjogLyogR0VUIENVUlJFTlQgVklERU8gTU9ERSAqLwogICAgICAgIFRSQUNFKCJHZXQgY3VycmVudCB2aWRlbyBtb2RlOiAtPiBtb2RlICVkLCBjb2x1bW5zICVkXG4iLCBkYXRhLT5WaWRlb01vZGUsIGRhdGEtPlZpZGVvQ29sdW1ucyk7CiAgICAgICAgLyogTm90ZTogVGhpcyBzaG91bGQgbm90IGJlIGEgY29uc3RhbnQgdmFsdWUuICovCiAgICAgICAgU0VUX0FMKCBjb250ZXh0LCBkYXRhLT5WaWRlb01vZGUgKTsKICAgICAgICBTRVRfQUgoIGNvbnRleHQsIGRhdGEtPlZpZGVvQ29sdW1ucyApOwogICAgICAgIFNFVF9CSCggY29udGV4dCwgMCApOyAvKiBEaXNwbGF5IHBhZ2UgMCAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxMDoKICAgICAgICBzd2l0Y2ggQUxfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MDA6IC8qIFNFVCBTSU5HTEUgUEFMRVRURSBSRUdJU1RFUiAtIEEuQy4gKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBTaW5nbGUgUGFsZXR0ZSBSZWdpc3RlciAtIFJlZyAweDAleCBWYWx1ZSAweDAleFxuIiwKCQlCTF9yZWcoY29udGV4dCksQkhfcmVnKGNvbnRleHQpKTsKCQkvKiBCSCBpcyB0aGUgdmFsdWUgIEJMIGlzIHRoZSByZWdpc3RlciAqLwoJCVZHQV9TZXRDb2xvcjE2KChpbnQpQkxfcmVnKGNvbnRleHQpLChpbnQpQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAxOiAvKiBTRVQgQk9SREVSIChPVkVSU0NBTikgKi8KICAgICAgICAgICAgLyogVGV4dCB0ZXJtaW5hbHMgaGF2ZSBubyBvdmVyc2NhbiAqLwoJICAgIC8qIEknbSBzZXR0aW5nIGl0IGFueXdheS4gLSBBLkMuICAgKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBCb3JkZXIgKE92ZXJzY2FuKSAtIElnbm9yZWQgYnV0IHNldC5cbiIpOwoJICAgIFZHQV9TZXRDb2xvcjE2KDE2LChpbnQpQkhfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDAyOiAvKiBTRVQgQUxMIFBBTEVUVEUgUkVHSVNURVJTIC0gQS5DLiovCiAgICAgICAgICAgIFRSQUNFKCJTZXQgYWxsIHBhbGV0dGUgcmVnaXN0ZXJzXG4iKTsKCQkvKiBFUzpEWCBwb2ludHMgdG8gYSAxNyBieXRlIHRhYmxlIG9mIGNvbG9ycyAqLwoJCS8qIE5vIHJldHVybiBkYXRhIGxpc3RlZCAqLwoJCS8qIEknbGwgaGF2ZSB0byB1cGRhdGUgbXkgdGFibGUgYW5kIHRoZSBkZWZhdWx0IHBhbGV0dGUgKi8KICAgICAgICAgICAgICAgVkdBX1NldDE2UGFsZXR0ZShDVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwgY29udGV4dC0+U2VnRXMsIGNvbnRleHQtPkVkeCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDM6IC8qIFRPR0dMRSBJTlRFTlNJVFkvQkxJTktJTkcgQklUICovCiAgICAgICAgICAgIEZJWE1FKCJUb2dnbGUgSW50ZW5zaXR5L0JsaW5raW5nIEJpdCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDc6IC8qIEdFVCBJTkRJVklEVUFMIFBBTEVUVEUgUkVHSVNURVIgIC0gQS5DLiovCiAgICAgICAgICAgIFRSQUNFKCJHZXQgSW5kaXZpZHVhbCBQYWxldHRlIFJlZ2lzdGVyIDB4MCV4XG4iLEJMX3JlZyhjb250ZXh0KSk7CgkJLyogQkwgaXMgcmVnaXN0ZXIgdG8gcmVhZCBbIDAtMTUgXSBCSCBpcyByZXR1cm4gdmFsdWUgKi8KCSAgICAgICAgU0VUX0JIKCBjb250ZXh0LCBWR0FfR2V0Q29sb3IxNigoaW50KUJMX3JlZyhjb250ZXh0KSkgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA4OiAvKiBSRUFEIE9WRVJTQ0FOIChCT1JERVIgQ09MT1IpIFJFR0lTVEVSICAtIEEuQy4gKi8KICAgICAgICAgICAgVFJBQ0UoIlJlYWQgT3ZlcnNjYW4gKEJvcmRlciBDb2xvcikgUmVnaXN0ZXIgXG4iKTsKCSAgICAgICAgU0VUX0JIKCBjb250ZXh0LCBWR0FfR2V0Q29sb3IxNigxNikgKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDA5OiAvKiBSRUFEIEFMTCBQQUxFVFRFIFJFR0lTVEVSUyBBTkQgT1ZFUlNDQU4gUkVHSVNURVIgLSBBLkMuKi8KICAgICAgICAgICAgVFJBQ0UoIlJlYWQgQWxsIFBhbGV0dGUgUmVnaXN0ZXJzIGFuZCBPdmVyc2NhbiBSZWdpc3RlciBcbiIpOwoJCS8qIEVTOkRYIHBvaW50cyB0byBhIDE3IGJ5dGUgdGFibGUgd2hlcmUgdGhlIHJlc3VsdHMgKi8KCQkvKiAgb2YgdGhpcyBjYWxsIHNob3VsZCBiZSBzdG9yZWQuICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgIFZHQV9HZXQxNlBhbGV0dGUoQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsIGNvbnRleHQtPlNlZ0VzLCBjb250ZXh0LT5FZHgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDEwOiAvKiBTRVQgSU5ESVZJRFVBTCBEQUMgUkVHSVNURVIgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgUEFMRVRURUVOVFJZIHBhbGRhdDsKCiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0IEluZGl2aWR1YWwgREFDIHJlZ2lzdGVyXG4iKTsKICAgICAgICAgICAgICAgIHBhbGRhdC5wZVJlZCAgID0gREhfcmVnKGNvbnRleHQpOwogICAgICAgICAgICAgICAgcGFsZGF0LnBlR3JlZW4gPSBDSF9yZWcoY29udGV4dCk7CiAgICAgICAgICAgICAgICBwYWxkYXQucGVCbHVlICA9IENMX3JlZyhjb250ZXh0KTsKICAgICAgICAgICAgICAgIHBhbGRhdC5wZUZsYWdzID0gMDsKICAgICAgICAgICAgICAgIFZHQV9TZXRQYWxldHRlKCZwYWxkYXQsQlhfcmVnKGNvbnRleHQpJjB4RkYsMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDEyOiAvKiBTRVQgQkxPQ0sgT0YgREFDIFJFR0lTVEVSUyAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgIFBBTEVUVEVFTlRSWSBwYWxkYXQ7CiAgICAgICAgICAgICAgICBCWVRFICpwdDsKCiAgICAgICAgICAgICAgICBUUkFDRSgiU2V0IEJsb2NrIG9mIERBQyByZWdpc3RlcnNcbiIpOwoJCXB0ID0gKEJZVEUqKUNUWF9TRUdfT0ZGX1RPX0xJTihjb250ZXh0LGNvbnRleHQtPlNlZ0VzLGNvbnRleHQtPkVkeCk7CgkJZm9yIChpPTA7aTxDWF9yZWcoY29udGV4dCk7aSsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZVJlZCAgID0gKCoocHQraSozKzApKSA8PCAyOwogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZUdyZWVuID0gKCoocHQraSozKzEpKSA8PCAyOwogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZUJsdWUgID0gKCoocHQraSozKzIpKSA8PCAyOwogICAgICAgICAgICAgICAgICAgIHBhbGRhdC5wZUZsYWdzID0gMDsKICAgICAgICAgICAgICAgICAgICBWR0FfU2V0UGFsZXR0ZSgmcGFsZGF0LChCWF9yZWcoY29udGV4dCkraSkmMHhGRiwxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTM6IC8qIFNFTEVDVCBWSURFTyBEQUMgQ09MT1IgUEFHRSAqLwogICAgICAgICAgICBGSVhNRSgiU2VsZWN0IHZpZGVvIERBQyBjb2xvciBwYWdlIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxNTogLyogUkVBRCBJTkRJVklEVUFMIERBQyBSRUdJU1RFUiAqLwogICAgICAgICAgICBGSVhNRSgiUmVhZCBpbmRpdmlkdWFsIERBQyByZWdpc3RlciAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MTc6IC8qIFJFQUQgQkxPQ0sgT0YgREFDIFJFR0lTVEVSUyAqLwogICAgICAgICAgICBGSVhNRSgiUmVhZCBibG9jayBvZiBEQUMgcmVnaXN0ZXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxODogLyogU0VUIFBFTCBNQVNLICovCiAgICAgICAgICAgIEZJWE1FKCJTZXQgUEVMIG1hc2sgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDE5OiAvKiBSRUFEIFBFTCBNQVNLICovCiAgICAgICAgICAgIEZJWE1FKCJSZWFkIFBFTCBtYXNrIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgxYTogLyogR0VUIFZJREVPIERBQyBDT0xPUiBQQUdFIFNUQVRFICovCiAgICAgICAgICAgIEZJWE1FKCJHZXQgdmlkZW8gREFDIGNvbG9yIHBhZ2Ugc3RhdGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDFiOiAvKiBQRVJGT1JNIEdSQVktU0NBTEUgU1VNTUlORyAqLwogICAgICAgICAgICBGSVhNRSgiUGVyZm9ybSBHcmF5LXNjYWxlIHN1bW1pbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MTAgQUwgPSAweCV4IC0gVW5rbm93blxuIiwKICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgMHgxMTogLyogVEVYVCBNT0RFIENIQVJHRU4gKi8KICAgICAgICAvKiBOb3RlIHRoYXQgc2Vjb25kIHN1YmZ1bmN0aW9uIGlzICphbG1vc3QqIGlkZW50aWNhbC4gKi8KICAgICAgICAvKiBTZWUgSU5URVJSVVBULkEgZm9yIGRldGFpbHMuICovCiAgICAgICAgc3dpdGNoIEFMX3JlZyhjb250ZXh0KSB7CiAgICAgICAgY2FzZSAweDAwOiAvKiBMT0FEIFVTRVIgU1BFQ0lGSUVEIFBBVFRFUk5TICovCiAgICAgICAgY2FzZSAweDEwOgogICAgICAgICAgICBGSVhNRSgiTG9hZCBVc2VyIFNwZWNpZmllZCBQYXR0ZXJucyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDE6IC8qIExPQUQgUk9NIE1PTk9DSFJPTUUgUEFUVEVSTlMgKi8KICAgICAgICBjYXNlIDB4MTE6CiAgICAgICAgICAgIEZJWE1FKCJMb2FkIFJPTSBNb25vY2hyb21lIFBhdHRlcm5zIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMjogLyogTE9BRCBST00gOHg4IERPVUJMRS1ET1QgUEFUVEVSTlMgKi8KICAgICAgICBjYXNlIDB4MTI6CiAgICAgICAgICAgIEZJWE1FKAogICAgICAgICAgICAgICAgIkxvYWQgUk9NIDh4OCBEb3VibGUgRG90IFBhdHRlcm5zIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgwMzogLyogU0VUIEJMT0NLIFNQRUNJRklFUiAqLwogICAgICAgICAgICBGSVhNRSgiU2V0IEJsb2NrIFNwZWNpZmllciAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDQ6IC8qIExPQUQgUk9NIDh4MTYgQ0hBUkFDVEVSIFNFVCAqLwogICAgICAgIGNhc2UgMHgxNDoKICAgICAgICAgICAgRklYTUUoIkxvYWQgUk9NIDh4MTYgQ2hhcmFjdGVyIFNldCAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjA6IC8qIFNFVCBVU0VSIDh4MTYgR1JBUEhJQ1MgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBVc2VyIDh4MTYgR3JhcGhpY3MgQ2hhcnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDIxOiAvKiBTRVQgVVNFUiBHUkFQSUNTIENIQVJBQ1RFUlMgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBVc2VyIEdyYXBoaWNzIENoYXJhY3RlcnMgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDIyOiAvKiBTRVQgUk9NIDh4MTQgR1JBUEhJQ1MgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBST00gOHgxNCBHcmFwaGljcyBDaGFycyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MjM6IC8qIFNFVCBST00gOHg4IERCTCBET1QgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoCiAgICAgICAgICAgICAgICAiU2V0IFJPTSA4eDggRGJsIERvdCBDaGFycyAoR3JhcGhpY3MpIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyNDogLyogTE9BRCA4eDE2IEdSQVBISUMgQ0hBUlMgKi8KICAgICAgICAgICAgRklYTUUoIkxvYWQgOHgxNiBHcmFwaGljIENoYXJzIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMDogLyogR0VUIEZPTlQgSU5GT1JNQVRJT04gKi8KICAgICAgICAgICAgRklYTUUoIkdldCBGb250IEluZm9ybWF0aW9uIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJJTlQgMTAgQUggPSAweDExIEFMID0gMHgleCAtIFVua25vd25cbiIsCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MTI6IC8qIEFMVEVSTkFURSBGVU5DVElPTiBTRUxFQ1QgKi8KICAgICAgICBzd2l0Y2ggQkxfcmVnKGNvbnRleHQpIHsKICAgICAgICBjYXNlIDB4MTA6IC8qIEdFVCBFR0EgSU5GTyAqLwogICAgICAgICAgICBUUkFDRSgiRUdBIGluZm8gcmVxdWVzdGVkXG4iKTsKICAgICAgICAgICAgU0VUX0JIKCBjb250ZXh0LCAweDAwICk7ICAgLyogQ29sb3Igc2NyZWVuICovCiAgICAgICAgICAgIFNFVF9CTCggY29udGV4dCwgZGF0YS0+TW9kZU9wdGlvbnMgPj4gNSApOyAvKiBFR0EgbWVtb3J5IHNpemUgKi8KICAgICAgICAgICAgU0VUX0NYKCBjb250ZXh0LCBkYXRhLT5GZWF0dXJlQml0c1N3aXRjaGVzICk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgyMDogLyogQUxURVJOQVRFIFBSVFNDICovCiAgICAgICAgICAgIEZJWE1FKCJJbnN0YWxsIEFsdGVybmF0ZSBQcmludCBTY3JlZW4gLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMwOiAvKiBTRUxFQ1QgVkVSVElDQUwgUkVTT1VMVElPTiAqLwogICAgICAgICAgICBGSVhNRSgiU2VsZWN0IHZlcnRpY2FsIHJlc29sdXRpb24gLSBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMxOiAvKiBFTkFCTEUvRElTQUJMRSBERUZBVUxUIFBBTEVUVEUgTE9BRElORyAqLwogICAgICAgICAgICBGSVhNRSgiRGVmYXVsdCBwYWxldHRlIGxvYWRpbmcgLSBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgZGF0YS0+VkdBU2V0dGluZ3MgPQogICAgICAgICAgICAgICAgKGRhdGEtPlZHQVNldHRpbmdzICYgMHhmNykgfAogICAgICAgICAgICAgICAgKChBTF9yZWcoY29udGV4dCkgPT0gMSkgPDwgMyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzMjogLyogRU5BQkxFL0RJU0FCTEUgVklERU8gQUREUkVSU1NJTkcgKi8KICAgICAgICAgICAgRklYTUUoIlZpZGVvIEFkZHJlc3NpbmcgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDMzOiAvKiBFTkFCTEUvRElTQUJMRSBHUkFZIFNDQUxFIFNVTU1JTkcgKi8KICAgICAgICAgICAgRklYTUUoIkdyYXkgU2NhbGUgU3VtbWluZyAtIE5vdCBTdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MzQ6IC8qIEVOQUJMRS9ESVNBQkxFIENVUlNPUiBFTVVMQVRJT04gKi8KICAgICAgICAgICAgVFJBQ0UoIlNldCBjdXJzb3IgZW11bGF0aW9uIHRvICVkXG4iLCBBTF9yZWcoY29udGV4dCkpOwogICAgICAgICAgICBkYXRhLT5Nb2RlT3B0aW9ucyA9CiAgICAgICAgICAgICAgICAoZGF0YS0+TW9kZU9wdGlvbnMgJiAweGZlKXwoQUxfcmVnKGNvbnRleHQpID09IDEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MzY6IC8qIFZJREVPIEFERFJFU1MgQ09OVFJPTCAqLwogICAgICAgICAgICBGSVhNRSgiVmlkZW8gQWRkcmVzcyBDb250cm9sIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIEZJWE1FKCJJTlQgMTAgQUggPSAweDExIEFMID0gMHgleCAtIFVua25vd25cbiIsCiAgICAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MTM6IC8qIFdSSVRFIFNUUklORyAqLwogICAgICAgIC8qIFRoaXMgb25lIGRvZXMgbm90IGltcGx5IHRoYXQgc3RyaW5nIGJlIGF0IGN1cnNvci4gKi8KICAgICAgICBGSVhNRSgiV3JpdGUgU3RyaW5nIC0gTm90IFN1cHBvcnRlZFxuIik7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAweDFhOgogICAgICAgIHN3aXRjaCBBTF9yZWcoY29udGV4dCkgewogICAgICAgIGNhc2UgMHgwMDogLyogR0VUIERJU1BMQVkgQ09NQklOQVRJT04gQ09ERSAqLwogICAgICAgICAgICBUUkFDRSgiR2V0IERpc3BsYXkgQ29tYmluYXRpb24gQ29kZVxuIik7CiAgICAgICAgICAgIFNFVF9BWCggY29udGV4dCwgMHgwMDFhICk7CiAgICAgICAgICAgIFNFVF9CTCggY29udGV4dCwgMHgwOCApOyAvKiBWR0Egdy8gY29sb3IgYW5hbG9nIGRpc3BsYXkgKi8KICAgICAgICAgICAgU0VUX0JIKCBjb250ZXh0LCAweDAwICk7IC8qIE5vIHNlY29uZGFyeSBoYXJkd2FyZSAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4MDE6IC8qIFNFVCBESVNQTEFZIENPTUJJTkFUSU9OIENPREUgKi8KICAgICAgICAgICAgRklYTUUoIlNldCBEaXNwbGF5IENvbWJpbmF0aW9uIENvZGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRklYTUUoIklOVCAxMCBBSCA9IDB4MWEgQUwgPSAweCV4IC0gVW5rbm93blxuIiwKICAgICAgICAgICAgICAgQUxfcmVnKGNvbnRleHQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgYnJlYWs7CgogICAgY2FzZSAweDFiOiAvKiBGVU5DVElPTkFMSVRZL1NUQVRFIElORk9STUFUSU9OICovCiAgICAgICAgVFJBQ0UoIkdldCBmdW5jdGlvbmFsaXR5L3N0YXRlIGluZm9ybWF0aW9uXG4iKTsKICAgICAgICBpZiAoQlhfcmVnKGNvbnRleHQpID09IDB4MCkKICAgICAgICB7CiAgICAgICAgICBTRVRfQUwoIGNvbnRleHQsIDB4MWIgKTsKICAgICAgICAgIC8qIENvcHkgc3RhdGUgaW5mb3JtYXRpb24gc3RydWN0dXJlIHRvIEVTOkRJICovCiAgICAgICAgICBtZW1jcHkoQ1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsY29udGV4dC0+U2VnRXMsY29udGV4dC0+RWRpKSwKICAgICAgICAgICAgICAgICAmQklPU19FWFRSQV9QVFItPnZpZF9zdGF0ZSxzaXplb2YoVklERU9TVEFURSkpOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4MWM6IC8qIFNBVkUvUkVTVE9SRSBWSURFTyBTVEFURSAqLwogICAgICAgIEZJWE1FKCJTYXZlL1Jlc3RvcmUgVmlkZW8gU3RhdGUgLSBOb3QgU3VwcG9ydGVkXG4iKTsKICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAweGVmOiAgLyogZ2V0IHZpZGVvIG1vZGUgZm9yIGhlcmN1bGVzLWNvbXBhdGlibGVzICAgKi8KICAgICAgICAgICAgICAgICAgICAvKiBUaGVyZSdzIG5vIHJlYXNvbiB0byByZWFsbHkgc3VwcG9ydCB0aGlzICAqLwogICAgICAgICAgICAgICAgICAgIC8qIGlzIHRoZXJlPy4uLi4uLi4uLi4uLi4uLi4uLi4uKEEuQy4pICAgICAgICovCiAgICAgICAgICAgICAgICBUUkFDRSgiSnVzdCByZXBvcnQgdGhlIHZpZGVvIG5vdCBoZXJjdWxlcyBjb21wYXRpYmxlXG4iKTsKICAgICAgICAgICAgICAgIFNFVF9EWCggY29udGV4dCwgMHhmZmZmICk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICBjYXNlIDB4NGY6IC8qIFZFU0EgKi8KICAgICAgICBET1NWTV9JbnQxMEhhbmRsZXJfVkVTQShjb250ZXh0KTsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIEZJWE1FKCJVbmtub3duIC0gMHgleFxuIiwgQUhfcmVnKGNvbnRleHQpKTsKICAgICAgICBJTlRfQkFSRiggY29udGV4dCwgMHgxMCApOwogICAgfQp9CgpzdGF0aWMgdm9pZCBzY3JvbGxfd2luZG93KGludCBkaXJlY3Rpb24sIGNoYXIgbGluZXMsIGNoYXIgcm93MSwKICAgY2hhciBjb2wxLCBjaGFyIHJvdzIsIGNoYXIgY29sMiwgY2hhciBhdHRyaWJ1dGUpCnsKICAgaWYgKCFsaW5lcykgLyogQWN0dWFsbHksIGNsZWFyIHRoZSB3aW5kb3cgKi8KICAgewogICAgICAgVkdBX0NsZWFyVGV4dChyb3cxLCBjb2wxLCByb3cyLCBjb2wyLCBhdHRyaWJ1dGUpOwogICB9CiAgIGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBTQ1JPTExfVVApCiAgIHsKICAgICAgIFZHQV9TY3JvbGxVcFRleHQocm93MSwgY29sMSwgcm93MiwgY29sMiwgbGluZXMsIGF0dHJpYnV0ZSk7CiAgIH0KICAgZWxzZQogICB7CiAgICAgICBWR0FfU2Nyb2xsRG93blRleHQocm93MSwgY29sMSwgcm93MiwgY29sMiwgbGluZXMsIGF0dHJpYnV0ZSk7CiAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBET1NWTV9QdXRDaGFyCiAqCiAqIFdyaXRlIHNpbmdsZSBjaGFyYWN0ZXIgdG8gVkdBIGNvbnNvbGUgYXQgdGhlIGN1cnJlbnQgCiAqIGN1cnNvciBwb3NpdGlvbiBhbmQgdXBkYXRlcyB0aGUgQklPUyBjdXJzb3IgcG9zaXRpb24uCiAqLwp2b2lkIFdJTkFQSSBET1NWTV9QdXRDaGFyKCBCWVRFIGFzY2lpICkKewogIEJJT1NEQVRBICpkYXRhID0gQklPU19EQVRBOwogIHVuc2lnbmVkICB4cG9zLCB5cG9zOwoKICBUUkFDRSgiY2hhcjogMHglMDJ4KCVjKVxuIiwgYXNjaWksIGFzY2lpKTsKCiAgRE9TVk1fSW5pdGlhbGl6ZVZpZGVvTW9kZSggZGF0YSApOwoKICBWR0FfUHV0Q2hhciggYXNjaWkgKTsKICBWR0FfR2V0Q3Vyc29yUG9zKCAmeHBvcywgJnlwb3MgKTsKICBCSU9TX1NldEN1cnNvclBvcyggZGF0YSwgMCwgeHBvcywgeXBvcyApOwp9Cg==