LyoKICogRGlyZWN0RHJhdyBoZWxwZXIgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVsbWVyCiAqIENvcHlyaWdodCAoYykgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERAogKgogKiBDb252ZXJ0cyBhbiBXSU5FRDNERk9STUFUIHZhbHVlIGludG8gYSBERFBJWEVMRk9STUFUIHN0cnVjdHVyZQogKgogKiBQYXJhbXM6CiAqICBERFBpeGVsRm9ybWF0OiBBZGRyZXNzIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gd3JpdGUgdGhlIHBpeGVsIGZvcm1hdCB0bwogKiAgV2luZUQzREZvcm1hdDogU291cmNlIGZvcm1hdAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKUGl4ZWxGb3JtYXRfV2luZUQzRHRvREQoRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBXaW5lRDNERm9ybWF0KQp7CiAgICBEV09SRCBTaXplID0gRERQaXhlbEZvcm1hdC0+ZHdTaXplOwogICAgVFJBQ0UoIkNvbnZlcnRpbmcgV0lORUQzREZPUk1BVCAlZCB0byBERFJBV1xuIiwgV2luZUQzREZvcm1hdCk7CgogICAgaWYoU2l6ZT09MCkgcmV0dXJuOwoKICAgIG1lbXNldChERFBpeGVsRm9ybWF0LCAweDAwLCBTaXplKTsKICAgIEREUGl4ZWxGb3JtYXQtPmR3U2l6ZSA9IFNpemU7CiAgICBzd2l0Y2goV2luZUQzREZvcm1hdCkKICAgIHsKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjhHOEI4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDI0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwMGZmMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAwMGZmMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOFI4RzhCODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMzI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwZmYwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHhmZjAwMDAwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOFI4RzhCODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBmZjAwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBmZjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhCOEc4Ujg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMzI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDBmZjAwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4RjgwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDdFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDFSNUc1QjU6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDdDMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAzRTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMUY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0ExUjVHNUI1OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4N0MwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDNFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDgwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRSNEc0QjQ6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQiB8IEREUEZfQUxQSEFQSVhFTFM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwRjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMEYwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDBGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4RjAwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9SM0czQjI6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gODsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4RTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDFDOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1BBTEVUVEVJTkRFWEVEOCB8IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9BTFBIQTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGggPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOFIzRzNCMjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwRTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMUM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHhGMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1g0UjRHNEI0OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwRjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMEYwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDBGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAvKiBIb3cgYXJlIFogYnVmZmVyIGJpdCBkZXB0aCBhbmQgU3RlbmNpbCBidWZmZXIgYml0IGRlcHRoIHJlbGF0ZWQ/CiAgICAgICAgICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QxNjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDAwMDBGRkZGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQlpCaXRNYXNrID0gMHgwMDAwMDAwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMzI6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1pCVUZGRVI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGggPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHhGRkZGRkZGRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JaQml0TWFzayA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDI0WDRTNDoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUiB8IEREUEZfU1RFTkNJTEJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICAvKiBTaG91bGQgSSBzZXQgZHdaQnVmZmVyQml0RGVwdGggdG8gMzIgaGVyZT8gKi8KICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGggPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGggPSA0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID0gMHgwMEZGRkZGRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MEYwMDAwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFM4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIC8qIFNob3VsZCBJIHNldCBkd1pCdWZmZXJCaXREZXB0aCB0byAzMiBoZXJlPyAqLwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDMyOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDAwRkZGRkZGRkY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweEZGMDAwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRYODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDMyOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDAwRkZGRkZGRkY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDAwMDAwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMTVTMToKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUiB8IEREUEZfU1RFTkNJTEJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDE7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDdmZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDgwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1VZVlk6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1lVWTI6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1lWMTI6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDE6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDI6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDM6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDU6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX01VTFRJMl9BUkdCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRzhSOF9HOEI4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4X0I4Rzg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0ZPVVJDQzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSBXaW5lRDNERm9ybWF0OwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgLyogTHVtaW5hbmNlICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0w4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9MVU1JTkFOQ0U7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3THVtaW5hbmNlQml0TWFzayA9IDB4ZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRMNDoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQUxQSEFQSVhFTFMgfCBERFBGX0xVTUlOQU5DRTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50ID0gNDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdMdW1pbmFuY2VCaXRNYXNrID0gMHgwZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4ZjA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThMODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQUxQSEFQSVhFTFMgfCBERFBGX0xVTUlOQU5DRTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3THVtaW5hbmNlQml0TWFzayA9IDB4MDBmZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4ZmYwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qIEJ1bXAgbWFwcGluZyAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9WOFU4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9CVU1QRFVEVjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0J1bXBCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0J1bXBEdUJpdE1hc2sgPSAgICAgICAgIDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9ICAgICAgICAgMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9ICAweDAwMDAwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDZWNVU1OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9CVU1QRFVEVjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd0J1bXBCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0J1bXBEdUJpdE1hc2sgPSAgICAgICAgIDB4MDAwMDAwMWY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9ICAgICAgICAgMHgwMDAwMDNlMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9ICAweDAwMDBmYzAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDAwMDAwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBFUlIoIkNhbid0IHRyYW5zbGF0ZSB0aGlzIFBpeGVsZm9ybWF0ICVkXG4iLCBXaW5lRDNERm9ybWF0KTsKICAgIH0KCiAgICBpZihUUkFDRV9PTihkZHJhdykpIHsKICAgICAgICBUUkFDRSgiUmV0dXJuaW5nOiAiKTsKICAgICAgICBERFJBV19kdW1wX3BpeGVsZm9ybWF0KEREUGl4ZWxGb3JtYXQpOwogICAgfQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQaXhlbEZvcm1hdF9ERDJXaW5lRDNECiAqCiAqIFJlYWRzIGEgRERQSVhFTEZPUk1BVCBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgdGhlIGVxdWFsIFdJTkVEM0RGT1JNQVQKICoKICogUGFyYW1zOgogKiAgRERQaXhlbEZvcm1hdDogVGhlIHNvdXJjZSBmb3JtYXQKICoKICogUmV0dXJuczoKICogIFRoZSBXSU5FRDNERk9STUFUIGVxdWFsIHRvIHRoZSBERHJhdyBmb3JtYXQKICogIFdJTkVEM0RGTVRfVU5LTk9XTiBpZiBhIG1hdGNoaW5nIGZvcm1hdCB3YXNuJ3QgZm91bmQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpXSU5FRDNERk9STUFUClBpeGVsRm9ybWF0X0REMldpbmVEM0QoY29uc3QgRERQSVhFTEZPUk1BVCAqRERQaXhlbEZvcm1hdCkKewogICAgVFJBQ0UoIkNvbnZlcnQgYSBEaXJlY3REcmF3IFBpeGVsZm9ybWF0IHRvIGEgV2luZUQzRCBQaXhlbGZvcm1hdFxuIik7ICAgIAogICAgaWYoVFJBQ0VfT04oZGRyYXcpKQogICAgewogICAgICAgIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQoRERQaXhlbEZvcm1hdCk7CiAgICB9CgogICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfUEFMRVRURUlOREVYRUQ4KQogICAgewogICAgICAgIHJldHVybiBXSU5FRDNERk1UX1A4OwogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgKEREUEZfUEFMRVRURUlOREVYRUQxIHwgRERQRl9QQUxFVFRFSU5ERVhFRDIgfCBERFBGX1BBTEVUVEVJTkRFWEVENCkgKQogICAgewogICAgICAgIEZJWE1FKCJERFBGX1BBTEVUVEVJTkRFWEVEMSB0byBERFBGX1BBTEVUVEVJTkRFWEVENCBhcmUgbm90IHN1cHBvcnRlZCBieSBXaW5lRDNEICh5ZXQpLiBSZXR1cm5pbmcgV0lORUQzREZNVF9QOFxuIik7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfUDg7CiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX1JHQikKICAgIHsKICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0IHRoYXQgY2FuIG1hdGNoIGhlcmUgKi8KICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1IzRzNCMjsKCiAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBDb2xvciBtYXNrcyAqLwogICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID09IDB4RjgwMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9PSAweDA3RTApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDFGKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfUjVHNkI1OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDdDMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwM0UwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAxRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweDgwMDApKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BMVI1RzVCNTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1gxUjVHNUI1OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDBGMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwMEYwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAwRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEYwMDApKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BNFI0RzRCNDsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1g0UjRHNEI0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4RkYwMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDAwRTApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwMDFDKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAwMykgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0E4UjNHM0IyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgRVJSKCIxNiBiaXQgUkdCIFBpeGVsIGZvcm1hdCBkb2VzIG5vdCBtYXRjaFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwoKICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1I4RzhCODsKCiAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBDb2xvciBtYXNrcyAqLwogICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID09IDB4MDBGRjAwMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwMDAwRkYwMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMDAwMEZGKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9BTFBIQVBJWEVMUykgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID09IDB4RkYwMDAwMDApKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BOFI4RzhCODsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1g4UjhHOEI4OwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEVSUigiMzIgYml0IFJHQiBwaXhlbCBmb3JtYXQgZG9lcyBub3QgbWF0Y2hcbiIpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIEVSUigiSW52YWxpZCBkd1JHQkJpdENvdW50IGluIFBpeGVsZm9ybWF0IHN0cnVjdHVyZVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIChERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9BTFBIQSkgKQogICAgewogICAgICAgIC8qIEFscGhhIG9ubHkgUGl4ZWxmb3JtYXQgKi8KICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdBbHBoYUJpdERlcHRoKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIEVSUigiVW5zdXBwb3J0ZWQgQWxwaGEtT25seSBiaXQgZGVwdGggMHgleFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdBbHBoYUJpdERlcHRoKTsKICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTg7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgRVJSKCJJbnZhbGlkIEFscGhhQml0RGVwdGggaW4gQWxwaGEtT25seSBQaXhlbGZvcm1hdFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfTFVNSU5BTkNFKQogICAgewogICAgICAgIC8qIEx1bWluYW5jZS1vbmx5IG9yIGx1bWluYW5jZS1hbHBoYSAqLwogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKQogICAgICAgIHsKICAgICAgICAgICAgLyogTHVtaW5hbmNlIHdpdGggQWxwaGEgKi8KICAgICAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGggPT0gNCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTRMNDsKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gQWxwaGEgLyBMdW1pbmFuY2UgYml0IGRlcHRoIGNvbWJpbmF0aW9uXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwoKICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICBFUlIoIkEgbHVtaW5hbmNlIFBpeGVsZm9ybWF0IHNob3VsZG4ndCBoYXZlIDYgbHVtaW5hbmNlIGJpdHMuIFJldHVybmluZyBEM0RGTVRfTDZWNVU1IGZvciBub3chIVxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDZWNVU1OwoKICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGggPT0gOCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQThMODsKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gQWxwaGEgLyBMdW1pbmNhc2UgYml0IGRlcHRoIGNvbWJpbmF0aW9uXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIC8qIEx1bWluYW5jZS1vbmx5ICovCiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd0x1bWluYW5jZUJpdENvdW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJBIGx1bWluYW5jZSBQaXhlbGZvcm1hdCBzaG91bGRuJ3QgaGF2ZSA2IGx1bWluYW5jZSBiaXRzLiBSZXR1cm5pbmcgRDNERk1UX0w2VjVVNSBmb3Igbm93ISFcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0w2VjVVNTsKCiAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDg7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gbHVtaW5hbmNlLW9ubHkgYml0IGRlcHRoIDB4JXhcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9aQlVGRkVSKQogICAgewogICAgICAgIC8qIFogYnVmZmVyICovCiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfU1RFTkNJTEJVRkZFUikKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIEZJWE1FKCI4IEJpdHMgWitTdGVuY2lsIGJ1ZmZlciBwaXhlbGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiBSZXR1cm5pbmcgV0lORUQzREZNVF9VTktOT1dOXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwoKICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgRklYTUUoIjE1IGJpdCBkZXB0aCBidWZmZXIgbm90IGhhbmRsZWQgeWV0LCBhc3N1bWluZyAxNiBiaXRcbiIpOwogICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMTVTMTsKCiAgICAgICAgICAgICAgICAgICAgRklYTUUoIkRvbid0IGtub3cgaG93IHRvIGhhbmRsZSBhIDE2IGJpdCBaIGJ1ZmZlciB3aXRoICVkIGJpdCBzdGVuY2lsIGJ1ZmZlciBwaXhlbGZvcm1hdFxuIiwgRERQaXhlbEZvcm1hdC0+dTIuZHdTdGVuY2lsQml0RGVwdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CgogICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICBGSVhNRSgiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGEgMjQgYml0IGRlcHRoIGJ1ZmZlciB3aXRoIHN0ZW5jaWwgYml0c1xuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0Uzg7CgogICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9PSA4KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMjRTODsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QyNFg0UzQ7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gWiBidWZmZXIgZGVwdGggJWRcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VTktOT1dOOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIEVSUigiOCBCaXQgWiBidWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkLiBUcnlpbmcgYSAxNiBCaXQgb25lXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMTY7CgogICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMTY7CgogICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICBGSVhNRSgiMjQgQml0IGRlcHRoIGJ1ZmZlciwgdHJlYXRpbmcgbGlrZSBhIDMyIGJpdCBvbmVcbiIpOwogICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51My5kd1pCaXRNYXNrID09IDB4MDBGRkZGRkYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0WDg7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPT0gMHhGRkZGRkZGRikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMzI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZJWE1FKCJVbmhhbmRsZWQgMzIgYml0IGRlcHRoIGJ1ZmZlciBiaXRtYXNrcywgcmV0dXJuaW5nIFdJTkVEM0RGTVRfRDI0WDhcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QyNFg4OyAvKiBUaGF0J3MgbW9zdCBsaWtlbHkgdG8gbWFrZSBnYW1lcyBoYXBweSAqLwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgRVJSKCJVbnN1cHBvcnRlZCBaIGJ1ZmZlciBkZXB0aCAlZFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykKICAgIHsKICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdVJywgJ1knLCAnVicsICdZJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VWVZZOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdZJywgJ1UnLCAnWScsICcyJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9ZVVkyOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdZJywgJ1YnLCAnMScsICcyJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9ZVjEyOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcxJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQxOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcyJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQyOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICczJykpCiAgICAgICAgewogICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDM7CiAgICAgICAgfQogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzQnKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDQ7CiAgICAgICAgfQogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzUnKSkKICAgICAgICB7CgkgICAgcmV0dXJuIFdJTkVEM0RGTVRfRFhUNTsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnRycsICdSJywgJ0cnLCAnQicpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRzhSOF9HOEI4OwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdSJywgJ0cnLCAnQicsICdHJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SOEc4X0I4Rzg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047ICAvKiBBYnVzZSB0aGlzIGFzIGFuIGVycm9yIHZhbHVlICovCiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0JVTVBEVURWKQogICAgewogICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgICAgICAgICA9PSAxNiAgICAgICAgKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrICAgICAgICA9PSAweDAwMDAwMGZmKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrICAgICAgICA9PSAweDAwMDBmZjAwKSAmJgogICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9PSAweDAwMDAwMDAwKSApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9WOFU4OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggKEREUGl4ZWxGb3JtYXQtPnUxLmR3QnVtcEJpdENvdW50ICAgICAgICAgPT0gMTYgICAgICAgICkgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUyLmR3QnVtcER1Qml0TWFzayAgICAgICAgPT0gMHgwMDAwMDAxZikgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayAgICAgICAgPT0gMHgwMDAwMDNlMCkgJiYKICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPT0gMHgwMDAwZmMwMCkgKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDZWNVU1OwogICAgICAgIH0KICAgIH0KCiAgICBFUlIoIlVua25vd24gUGl4ZWxmb3JtYXQhXG4iKTsKICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWYXJpb3VzIGR1bXBpbmcgZnVuY3Rpb25zLgogKgogKiBUaGV5IHdyaXRlIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmljIGZ1bmN0aW9uIHRvIGEgVFJBQ0UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKRERSQVdfZHVtcF9EV09SRChjb25zdCB2b2lkICppbikKewogICAgVFJBQ0UoIiVkXG4iLCAqKChjb25zdCBEV09SRCAqKSBpbikpOwp9CnN0YXRpYyB2b2lkCkREUkFXX2R1bXBfUFRSKGNvbnN0IHZvaWQgKmluKQp7CiAgICBUUkFDRSgiJXBcbiIsICooKGNvbnN0IHZvaWQgKiBjb25zdCopIGluKSk7Cn0Kc3RhdGljIHZvaWQKRERSQVdfZHVtcF9ERENPTE9SS0VZKGNvbnN0IEREQ09MT1JLRVkgKmRkY2spCnsKICAgIFRSQUNFKCJMb3cgOiAlZCAgLSBIaWdoIDogJWRcbiIsIGRkY2stPmR3Q29sb3JTcGFjZUxvd1ZhbHVlLCBkZGNrLT5kd0NvbG9yU3BhY2VIaWdoVmFsdWUpOwp9CgpzdGF0aWMgdm9pZCBERFJBV19kdW1wX2ZsYWdzX25vbGYoRFdPUkQgZmxhZ3MsIGNvbnN0IGZsYWdfaW5mbyogbmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX25hbWVzKQp7CiAgICB1bnNpZ25lZCBpbnQJaTsKCiAgICBmb3IgKGk9MDsgaSA8IG51bV9uYW1lczsgaSsrKQogICAgICAgIGlmICgoZmxhZ3MgJiBuYW1lc1tpXS52YWwpIHx8ICAgICAgLyogc3RhbmRhcmQgZmxhZyB2YWx1ZSAqLwogICAgICAgICAgICAoKCFmbGFncykgJiYgKCFuYW1lc1tpXS52YWwpKSkgLyogemVybyB2YWx1ZSBvbmx5ICovCiAgICAgICAgICAgIFRSQUNFKCIlcyAiLCBuYW1lc1tpXS5uYW1lKTsKfQoKc3RhdGljIHZvaWQgRERSQVdfZHVtcF9mbGFncyhEV09SRCBmbGFncywgY29uc3QgZmxhZ19pbmZvKiBuYW1lcywgc2l6ZV90IG51bV9uYW1lcykKewogICAgRERSQVdfZHVtcF9mbGFnc19ub2xmKGZsYWdzLCBuYW1lcywgbnVtX25hbWVzKTsKICAgIFRSQUNFKCJcbiIpOwp9Cgp2b2lkIEREUkFXX2R1bXBfRERTQ0FQUzIoY29uc3QgRERTQ0FQUzIgKmluKQp7CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPSB7CiAgICAgICAgRkUoRERTQ0FQU19SRVNFUlZFRDEpLAogICAgICAgIEZFKEREU0NBUFNfQUxQSEEpLAogICAgICAgIEZFKEREU0NBUFNfQkFDS0JVRkZFUiksCiAgICAgICAgRkUoRERTQ0FQU19DT01QTEVYKSwKICAgICAgICBGRShERFNDQVBTX0ZMSVApLAogICAgICAgIEZFKEREU0NBUFNfRlJPTlRCVUZGRVIpLAogICAgICAgIEZFKEREU0NBUFNfT0ZGU0NSRUVOUExBSU4pLAogICAgICAgIEZFKEREU0NBUFNfT1ZFUkxBWSksCiAgICAgICAgRkUoRERTQ0FQU19QQUxFVFRFKSwKICAgICAgICBGRShERFNDQVBTX1BSSU1BUllTVVJGQUNFKSwKICAgICAgICBGRShERFNDQVBTX1BSSU1BUllTVVJGQUNFTEVGVCksCiAgICAgICAgRkUoRERTQ0FQU19TWVNURU1NRU1PUlkpLAogICAgICAgIEZFKEREU0NBUFNfVEVYVFVSRSksCiAgICAgICAgRkUoRERTQ0FQU18zRERFVklDRSksCiAgICAgICAgRkUoRERTQ0FQU19WSURFT01FTU9SWSksCiAgICAgICAgRkUoRERTQ0FQU19WSVNJQkxFKSwKICAgICAgICBGRShERFNDQVBTX1dSSVRFT05MWSksCiAgICAgICAgRkUoRERTQ0FQU19aQlVGRkVSKSwKICAgICAgICBGRShERFNDQVBTX09XTkRDKSwKICAgICAgICBGRShERFNDQVBTX0xJVkVWSURFTyksCiAgICAgICAgRkUoRERTQ0FQU19IV0NPREVDKSwKICAgICAgICBGRShERFNDQVBTX01PREVYKSwKICAgICAgICBGRShERFNDQVBTX01JUE1BUCksCiAgICAgICAgRkUoRERTQ0FQU19SRVNFUlZFRDIpLAogICAgICAgIEZFKEREU0NBUFNfQUxMT0NPTkxPQUQpLAogICAgICAgIEZFKEREU0NBUFNfVklERU9QT1JUKSwKICAgICAgICBGRShERFNDQVBTX0xPQ0FMVklETUVNKSwKICAgICAgICBGRShERFNDQVBTX05PTkxPQ0FMVklETUVNKSwKICAgICAgICBGRShERFNDQVBTX1NUQU5EQVJEVkdBTU9ERSksCiAgICAgICAgRkUoRERTQ0FQU19PUFRJTUlaRUQpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczJbXSA9IHsKICAgICAgICBGRShERFNDQVBTMl9IQVJEV0FSRURFSU5URVJMQUNFKSwKICAgICAgICBGRShERFNDQVBTMl9ISU5URFlOQU1JQyksCiAgICAgICAgRkUoRERTQ0FQUzJfSElOVFNUQVRJQyksCiAgICAgICAgRkUoRERTQ0FQUzJfVEVYVFVSRU1BTkFHRSksCiAgICAgICAgRkUoRERTQ0FQUzJfUkVTRVJWRUQxKSwKICAgICAgICBGRShERFNDQVBTMl9SRVNFUlZFRDIpLAogICAgICAgIEZFKEREU0NBUFMyX09QQVFVRSksCiAgICAgICAgRkUoRERTQ0FQUzJfSElOVEFOVElBTElBU0lORyksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUCksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVgpLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVYKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWSksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVkpLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVaKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWiksCiAgICAgICAgRkUoRERTQ0FQUzJfTUlQTUFQU1VCTEVWRUwpLAogICAgICAgIEZFKEREU0NBUFMyX0QzRFRFWFRVUkVNQU5BR0UpLAogICAgICAgIEZFKEREU0NBUFMyX0RPTk9UUEVSU0lTVCksCiAgICAgICAgRkUoRERTQ0FQUzJfU1RFUkVPU1VSRkFDRUxFRlQpCiAgICB9OwoKICAgIEREUkFXX2R1bXBfZmxhZ3Nfbm9sZihpbi0+ZHdDYXBzLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pKTsKICAgIEREUkFXX2R1bXBfZmxhZ3MoaW4tPmR3Q2FwczIsIGZsYWdzMiwgc2l6ZW9mKGZsYWdzMikvc2l6ZW9mKGZsYWdzMlswXSkpOwp9Cgp2b2lkCkREUkFXX2R1bXBfRERTQ0FQUyhjb25zdCBERFNDQVBTICppbikKewogICAgRERTQ0FQUzIgaW5fYmlzOwoKICAgIGluX2Jpcy5kd0NhcHMgPSBpbi0+ZHdDYXBzOwogICAgaW5fYmlzLmR3Q2FwczIgPSAwOwogICAgaW5fYmlzLmR3Q2FwczMgPSAwOwogICAgaW5fYmlzLmR3Q2FwczQgPSAwOwoKICAgIEREUkFXX2R1bXBfRERTQ0FQUzIoJmluX2Jpcyk7Cn0KCnN0YXRpYyB2b2lkCkREUkFXX2R1bXBfcGl4ZWxmb3JtYXRfZmxhZyhEV09SRCBmbGFnbWFzaykKewogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnc1tdID0KICAgICAgICB7CiAgICAgICAgICAgIEZFKEREUEZfQUxQSEFQSVhFTFMpLAogICAgICAgICAgICBGRShERFBGX0FMUEhBKSwKICAgICAgICAgICAgRkUoRERQRl9GT1VSQ0MpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVENCksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRURUTzgpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEOCksCiAgICAgICAgICAgIEZFKEREUEZfUkdCKSwKICAgICAgICAgICAgRkUoRERQRl9DT01QUkVTU0VEKSwKICAgICAgICAgICAgRkUoRERQRl9SR0JUT1lVViksCiAgICAgICAgICAgIEZFKEREUEZfWVVWKSwKICAgICAgICAgICAgRkUoRERQRl9aQlVGRkVSKSwKICAgICAgICAgICAgRkUoRERQRl9QQUxFVFRFSU5ERVhFRDEpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEMiksCiAgICAgICAgICAgIEZFKEREUEZfWlBJWEVMUykKICAgIH07CgogICAgRERSQVdfZHVtcF9mbGFnc19ub2xmKGZsYWdtYXNrLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pKTsKfQoKc3RhdGljIHZvaWQKRERSQVdfZHVtcF9tZW1iZXJzKERXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlcl9pbmZvKiBtZW1zLAogICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9tZW1zKQp7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBmb3IgKGk9MDsgaSA8IG51bV9tZW1zOyBpKyspCiAgICB7CiAgICAgICAgaWYgKG1lbXNbaV0udmFsICYgZmxhZ3MpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgiIC0gJXMgOiAiLCBtZW1zW2ldLm5hbWUpOwogICAgICAgICAgICBtZW1zW2ldLmZ1bmMoKGNvbnN0IGNoYXIgKilkYXRhICsgbWVtc1tpXS5vZmZzZXQpOwogICAgICAgIH0KICAgIH0KfQoKdm9pZApERFJBV19kdW1wX3BpeGVsZm9ybWF0KGNvbnN0IEREUElYRUxGT1JNQVQgKnBmKQp7CiAgICBUUkFDRSgiKCAiKTsKICAgIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXRfZmxhZyhwZi0+ZHdGbGFncyk7CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykKICAgIHsKICAgICAgICBUUkFDRSgiLCBkd0ZvdXJDQyBjb2RlICclYyVjJWMlYycgKDB4JTA4eCkgLSAlZCBiaXRzIHBlciBwaXhlbCIsCiAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoIHBmLT5kd0ZvdXJDQyAgICAgJjB4ZmYpLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKChwZi0+ZHdGb3VyQ0M+PiA4KSYweGZmKSwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSgocGYtPmR3Rm91ckNDPj4xNikmMHhmZiksCiAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+MjQpJjB4ZmYpLAogICAgICAgICAgICAgICAgcGYtPmR3Rm91ckNDLAogICAgICAgICAgICAgICAgcGYtPnUxLmR3WVVWQml0Q291bnQKICAgICAgICApOwogICAgfQogICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9SR0IpCiAgICB7CiAgICAgICAgY29uc3QgY2hhciAqY21kOwogICAgICAgIFRSQUNFKCIsIFJHQiBiaXRzOiAlZCwgIiwgcGYtPnUxLmR3UkdCQml0Q291bnQpOwogICAgICAgIHN3aXRjaCAocGYtPnUxLmR3UkdCQml0Q291bnQpCiAgICAgICAgewogICAgICAgIGNhc2UgNDogY21kID0gIiUxbHgiOyBicmVhazsKICAgICAgICBjYXNlIDg6IGNtZCA9ICIlMDJseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMTY6IGNtZCA9ICIlMDRseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMjQ6IGNtZCA9ICIlMDZseCI7IGJyZWFrOwogICAgICAgIGNhc2UgMzI6IGNtZCA9ICIlMDhseCI7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IEVSUigiVW5leHBlY3RlZCBiaXQgZGVwdGggIVxuIik7IGNtZCA9ICIlZCI7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBUUkFDRSgiIFIgIik7IFRSQUNFKGNtZCwgcGYtPnUyLmR3UkJpdE1hc2spOwogICAgICAgIFRSQUNFKCIgRyAiKTsgVFJBQ0UoY21kLCBwZi0+dTMuZHdHQml0TWFzayk7CiAgICAgICAgVFJBQ0UoIiBCICIpOyBUUkFDRShjbWQsIHBmLT51NC5kd0JCaXRNYXNrKTsKICAgICAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoIiBBICIpOyBUUkFDRShjbWQsIHBmLT51NS5kd1JHQkFscGhhQml0TWFzayk7CiAgICAgICAgfQogICAgICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfWlBJWEVMUykKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCIgWiAiKTsgVFJBQ0UoY21kLCBwZi0+dTUuZHdSR0JaQml0TWFzayk7CiAgICAgICAgfQogICAgfQogICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9aQlVGRkVSKQogICAgewogICAgICAgIFRSQUNFKCIsIFogYml0cyA6ICVkIiwgcGYtPnUxLmR3WkJ1ZmZlckJpdERlcHRoKTsKICAgIH0KICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfQUxQSEEpCiAgICB7CiAgICAgICAgVFJBQ0UoIiwgQWxwaGEgYml0cyA6ICVkIiwgcGYtPnUxLmR3QWxwaGFCaXREZXB0aCk7CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0JVTVBEVURWKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmNtZCA9ICIlMDhseCI7CiAgICAgICAgVFJBQ0UoIiwgQnVtcCBiaXRzOiAlZCwgIiwgcGYtPnUxLmR3QnVtcEJpdENvdW50KTsKICAgICAgICBUUkFDRSgiIFUgIik7IFRSQUNFKGNtZCwgcGYtPnUyLmR3QnVtcER1Qml0TWFzayk7CiAgICAgICAgVFJBQ0UoIiBWICIpOyBUUkFDRShjbWQsIHBmLT51My5kd0J1bXBEdkJpdE1hc2spOwogICAgICAgIFRSQUNFKCIgTCAiKTsgVFJBQ0UoY21kLCBwZi0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayk7CiAgICB9CiAgICBUUkFDRSgiKVxuIik7Cn0KCnZvaWQgRERSQVdfZHVtcF9zdXJmYWNlX2Rlc2MoY29uc3QgRERTVVJGQUNFREVTQzIgKmxwZGRzZCkKewojZGVmaW5lIFNUUlVDVCBERFNVUkZBQ0VERVNDMgogICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNbXSA9CiAgICAgICAgewogICAgICAgICAgICBNRShERFNEX0hFSUdIVCwgRERSQVdfZHVtcF9EV09SRCwgZHdIZWlnaHQpLAogICAgICAgICAgICBNRShERFNEX1dJRFRILCBERFJBV19kdW1wX0RXT1JELCBkd1dpZHRoKSwKICAgICAgICAgICAgTUUoRERTRF9QSVRDSCwgRERSQVdfZHVtcF9EV09SRCwgdTEgLyogbFBpdGNoICovKSwKICAgICAgICAgICAgTUUoRERTRF9MSU5FQVJTSVpFLCBERFJBV19kdW1wX0RXT1JELCB1MSAvKiBkd0xpbmVhclNpemUgKi8pLAogICAgICAgICAgICBNRShERFNEX0JBQ0tCVUZGRVJDT1VOVCwgRERSQVdfZHVtcF9EV09SRCwgZHdCYWNrQnVmZmVyQ291bnQpLAogICAgICAgICAgICBNRShERFNEX01JUE1BUENPVU5ULCBERFJBV19kdW1wX0RXT1JELCB1MiAvKiBkd01pcE1hcENvdW50ICovKSwKICAgICAgICAgICAgTUUoRERTRF9aQlVGRkVSQklUREVQVEgsIEREUkFXX2R1bXBfRFdPUkQsIHUyIC8qIGR3WkJ1ZmZlckJpdERlcHRoICovKSwgLyogVGhpcyBpcyBmb3IgJ29sZC1zdHlsZScgRDNEICovCiAgICAgICAgICAgIE1FKEREU0RfUkVGUkVTSFJBVEUsIEREUkFXX2R1bXBfRFdPUkQsIHUyIC8qIGR3UmVmcmVzaFJhdGUgKi8pLAogICAgICAgICAgICBNRShERFNEX0FMUEhBQklUREVQVEgsIEREUkFXX2R1bXBfRFdPUkQsIGR3QWxwaGFCaXREZXB0aCksCiAgICAgICAgICAgIE1FKEREU0RfTFBTVVJGQUNFLCBERFJBV19kdW1wX1BUUiwgbHBTdXJmYWNlKSwKICAgICAgICAgICAgTUUoRERTRF9DS0RFU1RPVkVSTEFZLCBERFJBV19kdW1wX0REQ09MT1JLRVksIHUzIC8qIGRkY2tDS0Rlc3RPdmVybGF5ICovKSwKICAgICAgICAgICAgTUUoRERTRF9DS0RFU1RCTFQsIEREUkFXX2R1bXBfRERDT0xPUktFWSwgZGRja0NLRGVzdEJsdCksCiAgICAgICAgICAgIE1FKEREU0RfQ0tTUkNPVkVSTEFZLCBERFJBV19kdW1wX0REQ09MT1JLRVksIGRkY2tDS1NyY092ZXJsYXkpLAogICAgICAgICAgICBNRShERFNEX0NLU1JDQkxULCBERFJBV19kdW1wX0REQ09MT1JLRVksIGRkY2tDS1NyY0JsdCksCiAgICAgICAgICAgIE1FKEREU0RfUElYRUxGT1JNQVQsIEREUkFXX2R1bXBfcGl4ZWxmb3JtYXQsIHU0IC8qIGRkcGZQaXhlbEZvcm1hdCAqLykKICAgICAgICB9OwogICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNfY2Fwc1tdID0KICAgICAgICB7CiAgICAgICAgICAgIE1FKEREU0RfQ0FQUywgRERSQVdfZHVtcF9ERFNDQVBTLCBkZHNDYXBzKQogICAgICAgIH07CiAgICBzdGF0aWMgY29uc3QgbWVtYmVyX2luZm8gbWVtYmVyc19jYXBzMltdID0KICAgICAgICB7CiAgICAgICAgICAgIE1FKEREU0RfQ0FQUywgRERSQVdfZHVtcF9ERFNDQVBTMiwgZGRzQ2FwcykKICAgICAgICB9OwojdW5kZWYgU1RSVUNUCgogICAgaWYgKE5VTEwgPT0gbHBkZHNkKQogICAgewogICAgICAgIFRSQUNFKCIobnVsbClcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAobHBkZHNkLT5kd1NpemUgPj0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKSkKICAgICAgewogICAgICAgICAgRERSQVdfZHVtcF9tZW1iZXJzKGxwZGRzZC0+ZHdGbGFncywgbHBkZHNkLCBtZW1iZXJzX2NhcHMyLCAxKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIEREUkFXX2R1bXBfbWVtYmVycyhscGRkc2QtPmR3RmxhZ3MsIGxwZGRzZCwgbWVtYmVyc19jYXBzLCAxKTsKICAgICAgfQogICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lbWJlcnMpL3NpemVvZihtZW1iZXJzWzBdKSk7CiAgICB9Cn0KCnZvaWQKZHVtcF9EM0RNQVRSSVgoY29uc3QgRDNETUFUUklYICptYXQpCnsKICAgIFRSQUNFKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl8xMSwgbWF0LT5fMTIsIG1hdC0+XzEzLCBtYXQtPl8xNCk7CiAgICBUUkFDRSgiICAlZiAlZiAlZiAlZlxuIiwgbWF0LT5fMjEsIG1hdC0+XzIyLCBtYXQtPl8yMywgbWF0LT5fMjQpOwogICAgVFJBQ0UoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzMxLCBtYXQtPl8zMiwgbWF0LT5fMzMsIG1hdC0+XzM0KTsKICAgIFRSQUNFKCIgICVmICVmICVmICVmXG4iLCBtYXQtPl80MSwgbWF0LT5fNDIsIG1hdC0+XzQzLCBtYXQtPl80NCk7Cn0KCkRXT1JECmdldF9mbGV4aWJsZV92ZXJ0ZXhfc2l6ZShEV09SRCBkM2R2dFZlcnRleFR5cGUpCnsKICAgIERXT1JEIHNpemUgPSAwOwogICAgaW50IGk7CgogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9OT1JNQUwpIHNpemUgKz0gMyAqIHNpemVvZihEM0RWQUxVRSk7CiAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX0RJRkZVU0UpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfU1BFQ1VMQVIpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfUkVTRVJWRUQxKSBzaXplICs9IHNpemVvZihEV09SRCk7CiAgICBzd2l0Y2ggKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9QT1NJVElPTl9NQVNLKQogICAgewogICAgICAgIGNhc2UgRDNERlZGX1hZWjogICAgc2l6ZSArPSAzICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RGVkZfWFlaUkhXOiBzaXplICs9IDQgKiBzaXplb2YoRDNEVkFMVUUpOyBicmVhazsKICAgICAgICBjYXNlIEQzREZWRl9YWVpCMTogIHNpemUgKz0gNCAqIHNpemVvZihEM0RWQUxVRSk7IGJyZWFrOwogICAgICAgIGNhc2UgRDNERlZGX1hZWkIyOiAgc2l6ZSArPSA1ICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CiAgICAgICAgY2FzZSBEM0RGVkZfWFlaQjM6ICBzaXplICs9IDYgKiBzaXplb2YoRDNEVkFMVUUpOyBicmVhazsKICAgICAgICBjYXNlIEQzREZWRl9YWVpCNDogIHNpemUgKz0gNyAqIHNpemVvZihEM0RWQUxVRSk7IGJyZWFrOwogICAgICAgIGNhc2UgRDNERlZGX1hZWkI1OiAgc2l6ZSArPSA4ICogc2l6ZW9mKEQzRFZBTFVFKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogRVJSKCJVbmV4cGVjdGVkIHBvc2l0aW9uIG1hc2tcbiIpOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUpOyBpKyspCiAgICB7CiAgICAgICAgc2l6ZSArPSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIGkpICogc2l6ZW9mKEQzRFZBTFVFKTsKICAgIH0KCiAgICByZXR1cm4gc2l6ZTsKfQoKdm9pZCBERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwgRERTQ0FQUzIqIHBPdXQpCnsKICAgIC8qIDIgYWRkcyB0aHJlZSBhZGRpdGlvbmFsIGNhcHMgZmllbGRzIHRvIHRoZSBlbmQuIEJvdGggdmVyc2lvbnMKICAgICAqIGFyZSB1bnZlcnNpb25lZC4gKi8KICAgIHBPdXQtPmR3Q2FwcyA9IHBJbi0+ZHdDYXBzOwogICAgcE91dC0+ZHdDYXBzMiA9IDA7CiAgICBwT3V0LT5kd0NhcHMzID0gMDsKICAgIHBPdXQtPmR3Q2FwczQgPSAwOwp9Cgp2b2lkIEREUkFXX0NvbnZlcnRfRERERVZJQ0VJREVOVElGSUVSXzJfVG9fMShjb25zdCBERERFVklDRUlERU5USUZJRVIyKiBwSW4sIEREREVWSUNFSURFTlRJRklFUiogcE91dCkKewogICAgLyogMiBhZGRzIGEgZHdXSFFMTGV2ZWwgZmllbGQgdG8gdGhlIGVuZC4gQm90aCBzdHJ1Y3R1cmVzIGFyZQogICAgICogdW52ZXJzaW9uZWQuICovCiAgICBtZW1jcHkocE91dCwgcEluLCBzaXplb2YoKnBPdXQpKTsKfQoKdm9pZCBERFJBV19kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoRFdPUkQgY29vcGxldmVsKQp7CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQogICAgICAgIHsKICAgICAgICAgICAgRkUoRERTQ0xfRlVMTFNDUkVFTiksCiAgICAgICAgICAgIEZFKEREU0NMX0FMTE9XUkVCT09UKSwKICAgICAgICAgICAgRkUoRERTQ0xfTk9XSU5ET1dDSEFOR0VTKSwKICAgICAgICAgICAgRkUoRERTQ0xfTk9STUFMKSwKICAgICAgICAgICAgRkUoRERTQ0xfQUxMT1dNT0RFWCksCiAgICAgICAgICAgIEZFKEREU0NMX0VYQ0xVU0lWRSksCiAgICAgICAgICAgIEZFKEREU0NMX1NFVEZPQ1VTV0lORE9XKSwKICAgICAgICAgICAgRkUoRERTQ0xfU0VUREVWSUNFV0lORE9XKSwKICAgICAgICAgICAgRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQogICAgfTsKCiAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQogICAgewogICAgICAgIFRSQUNFKCIgLSAiKTsKICAgICAgICBERFJBV19kdW1wX2ZsYWdzKGNvb3BsZXZlbCwgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSk7CiAgICB9Cn0KCnZvaWQgRERSQVdfZHVtcF9ERENBUFMoY29uc3QgRERDQVBTICpscGNhcHMpCnsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3MxW10gPQogICAgewogICAgICBGRShERENBUFNfM0QpLAogICAgICBGRShERENBUFNfQUxJR05CT1VOREFSWURFU1QpLAogICAgICBGRShERENBUFNfQUxJR05TSVpFREVTVCksCiAgICAgIEZFKEREQ0FQU19BTElHTkJPVU5EQVJZU1JDKSwKICAgICAgRkUoRERDQVBTX0FMSUdOU0laRVNSQyksCiAgICAgIEZFKEREQ0FQU19BTElHTlNUUklERSksCiAgICAgIEZFKEREQ0FQU19CTFQpLAogICAgICBGRShERENBUFNfQkxUUVVFVUUpLAogICAgICBGRShERENBUFNfQkxURk9VUkNDKSwKICAgICAgRkUoRERDQVBTX0JMVFNUUkVUQ0gpLAogICAgICBGRShERENBUFNfR0RJKSwKICAgICAgRkUoRERDQVBTX09WRVJMQVkpLAogICAgICBGRShERENBUFNfT1ZFUkxBWUNBTlRDTElQKSwKICAgICAgRkUoRERDQVBTX09WRVJMQVlGT1VSQ0MpLAogICAgICBGRShERENBUFNfT1ZFUkxBWVNUUkVUQ0gpLAogICAgICBGRShERENBUFNfUEFMRVRURSksCiAgICAgIEZFKEREQ0FQU19QQUxFVFRFVlNZTkMpLAogICAgICBGRShERENBUFNfUkVBRFNDQU5MSU5FKSwKICAgICAgRkUoRERDQVBTX1NURVJFT1ZJRVcpLAogICAgICBGRShERENBUFNfVkJJKSwKICAgICAgRkUoRERDQVBTX1pCTFRTKSwKICAgICAgRkUoRERDQVBTX1pPVkVSTEFZUyksCiAgICAgIEZFKEREQ0FQU19DT0xPUktFWSksCiAgICAgIEZFKEREQ0FQU19BTFBIQSksCiAgICAgIEZFKEREQ0FQU19DT0xPUktFWUhXQVNTSVNUKSwKICAgICAgRkUoRERDQVBTX05PSEFSRFdBUkUpLAogICAgICBGRShERENBUFNfQkxUQ09MT1JGSUxMKSwKICAgICAgRkUoRERDQVBTX0JBTktTV0lUQ0hFRCksCiAgICAgIEZFKEREQ0FQU19CTFRERVBUSEZJTEwpLAogICAgICBGRShERENBUFNfQ0FOQ0xJUCksCiAgICAgIEZFKEREQ0FQU19DQU5DTElQU1RSRVRDSEVEKSwKICAgICAgRkUoRERDQVBTX0NBTkJMVFNZU01FTSkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzMltdID0KICAgIHsKICAgICAgRkUoRERDQVBTMl9DRVJUSUZJRUQpLAogICAgICBGRShERENBUFMyX05PMkREVVJJTkczRFNDRU5FKSwKICAgICAgRkUoRERDQVBTMl9WSURFT1BPUlQpLAogICAgICBGRShERENBUFMyX0FVVE9GTElQT1ZFUkxBWSksCiAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CSU5URVJMRUFWRUQpLAogICAgICBGRShERENBUFMyX0NBTkJPQk5PTklOVEVSTEVBVkVEKSwKICAgICAgRkUoRERDQVBTMl9DT0xPUkNPTlRST0xPVkVSTEFZKSwKICAgICAgRkUoRERDQVBTMl9DT0xPUkNPTlRST0xQUklNQVJZKSwKICAgICAgRkUoRERDQVBTMl9DQU5EUk9QWjE2QklUKSwKICAgICAgRkUoRERDQVBTMl9OT05MT0NBTFZJRE1FTSksCiAgICAgIEZFKEREQ0FQUzJfTk9OTE9DQUxWSURNRU1DQVBTKSwKICAgICAgRkUoRERDQVBTMl9OT1BBR0VMT0NLUkVRVUlSRUQpLAogICAgICBGRShERENBUFMyX1dJREVTVVJGQUNFUyksCiAgICAgIEZFKEREQ0FQUzJfQ0FORkxJUE9EREVWRU4pLAogICAgICBGRShERENBUFMyX0NBTkJPQkhBUkRXQVJFKSwKICAgICAgRkUoRERDQVBTMl9DT1BZRk9VUkNDKSwKICAgICAgRkUoRERDQVBTMl9QUklNQVJZR0FNTUEpLAogICAgICBGRShERENBUFMyX0NBTlJFTkRFUldJTkRPV0VEKSwKICAgICAgRkUoRERDQVBTMl9DQU5DQUxJQlJBVEVHQU1NQSksCiAgICAgIEZFKEREQ0FQUzJfRkxJUElOVEVSVkFMKSwKICAgICAgRkUoRERDQVBTMl9GTElQTk9WU1lOQyksCiAgICAgIEZFKEREQ0FQUzJfQ0FOTUFOQUdFVEVYVFVSRSksCiAgICAgIEZFKEREQ0FQUzJfVEVYTUFOSU5OT05MT0NBTFZJRE1FTSksCiAgICAgIEZFKEREQ0FQUzJfU1RFUkVPKSwKICAgICAgRkUoRERDQVBTMl9TWVNUT05PTkxPQ0FMX0FTX1NZU1RPTE9DQUwpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczNbXSA9CiAgICB7CiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVCksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVENMUlNQQUNFKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RCTFRZVVYpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWUNMUlNQQUNFKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWUNMUlNQQUNFWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWU9ORUFDVElWRSksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVlZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ0JMVCksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUQ0xSU1BBQ0UpLAogICAgICBGRShERENLRVlDQVBTX1NSQ0JMVENMUlNQQUNFWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNCTFRZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVkpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlDTFJTUEFDRSksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWUNMUlNQQUNFWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZT05FQUNUSVZFKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZWVVWKSwKICAgICAgRkUoRERDS0VZQ0FQU19OT0NPU1RPVkVSTEFZKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M0W10gPQogICAgewogICAgICBGRShEREZYQ0FQU19CTFRBTFBIQSksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBTFBIQSksCiAgICAgIEZFKERERlhDQVBTX0JMVEFSSVRIU1RSRVRDSFlOKSwKICAgICAgRkUoRERGWENBUFNfQkxUQVJJVEhTVFJFVENIWSksCiAgICAgIEZFKERERlhDQVBTX0JMVE1JUlJPUkxFRlRSSUdIVCksCiAgICAgIEZFKERERlhDQVBTX0JMVE1JUlJPUlVQRE9XTiksCiAgICAgIEZFKERERlhDQVBTX0JMVFJPVEFUSU9OKSwKICAgICAgRkUoRERGWENBUFNfQkxUUk9UQVRJT045MCksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1gpLAogICAgICBGRShEREZYQ0FQU19CTFRTSFJJTktYTiksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1kpLAogICAgICBGRShEREZYQ0FQU19CTFRTSFJJTktZTiksCiAgICAgIEZFKERERlhDQVBTX0JMVFNUUkVUQ0hYKSwKICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFhOKSwKICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFkpLAogICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWU4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZQVJJVEhTVFJFVENIWSksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBUklUSFNUUkVUQ0hZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTSFJJTktYKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1hOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1kpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWU4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFgpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFhOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hZKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNUUkVUQ0hZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlNSVJST1JMRUZUUklHSFQpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZTUlSUk9SVVBET1dOKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M1W10gPQogICAgewogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBRURHRUJMRU5EKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVBJWEVMUyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFQSVhFTFNORUcpLAogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBU1VSRkFDRVMpLAogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBU1VSRkFDRVNORUcpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQUVER0VCTEVORCksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBUElYRUxTKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFQSVhFTFNORUcpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQVNVUkZBQ0VTKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFTVVJGQUNFU05FRykKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzNltdID0KICAgIHsKICAgICAgRkUoRERQQ0FQU180QklUKSwKICAgICAgRkUoRERQQ0FQU184QklURU5UUklFUyksCiAgICAgIEZFKEREUENBUFNfOEJJVCksCiAgICAgIEZFKEREUENBUFNfSU5JVElBTElaRSksCiAgICAgIEZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0UpLAogICAgICBGRShERFBDQVBTX1BSSU1BUllTVVJGQUNFTEVGVCksCiAgICAgIEZFKEREUENBUFNfQUxMT1cyNTYpLAogICAgICBGRShERFBDQVBTX1ZTWU5DKSwKICAgICAgRkUoRERQQ0FQU18xQklUKSwKICAgICAgRkUoRERQQ0FQU18yQklUKSwKICAgICAgRkUoRERQQ0FQU19BTFBIQSksCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczdbXSA9CiAgICB7CiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMSksCiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMiksCiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVEMyksCiAgICAgIEZFKEREU1ZDQVBTX1JFU0VSVkVENCksCiAgICAgIEZFKEREU1ZDQVBTX1NURVJFT1NFUVVFTlRJQUwpLAogICAgfTsKCiAgICBUUkFDRSgiIC0gZHdTaXplIDogJWRcbiIsIGxwY2Fwcy0+ZHdTaXplKTsKICAgIFRSQUNFKCIgLSBkd0NhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3Q2FwcywgZmxhZ3MxLCBzaXplb2YoZmxhZ3MxKS9zaXplb2YoZmxhZ3MxWzBdKSk7CiAgICBUUkFDRSgiIC0gZHdDYXBzMiA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdDYXBzMiwgZmxhZ3MyLCBzaXplb2YoZmxhZ3MyKS9zaXplb2YoZmxhZ3MyWzBdKSk7CiAgICBUUkFDRSgiIC0gZHdDS2V5Q2FwcyA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdDS2V5Q2FwcywgZmxhZ3MzLCBzaXplb2YoZmxhZ3MzKS9zaXplb2YoZmxhZ3MzWzBdKSk7CiAgICBUUkFDRSgiIC0gZHdGWENhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3RlhDYXBzLCBmbGFnczQsIHNpemVvZihmbGFnczQpL3NpemVvZihmbGFnczRbMF0pKTsKICAgIFRSQUNFKCIgLSBkd0ZYQWxwaGFDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0ZYQWxwaGFDYXBzLCBmbGFnczUsIHNpemVvZihmbGFnczUpL3NpemVvZihmbGFnczVbMF0pKTsKICAgIFRSQUNFKCIgLSBkd1BhbENhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3UGFsQ2FwcywgZmxhZ3M2LCBzaXplb2YoZmxhZ3M2KS9zaXplb2YoZmxhZ3M2WzBdKSk7CiAgICBUUkFDRSgiIC0gZHdTVkNhcHMgOiAiKTsgRERSQVdfZHVtcF9mbGFncyhscGNhcHMtPmR3U1ZDYXBzLCBmbGFnczcsIHNpemVvZihmbGFnczcpL3NpemVvZihmbGFnczdbMF0pKTsKICAgIFRSQUNFKCIuLi5cbiIpOwogICAgVFJBQ0UoIiAtIGR3TnVtRm91ckNDQ29kZXMgOiAlZFxuIiwgbHBjYXBzLT5kd051bUZvdXJDQ0NvZGVzKTsKICAgIFRSQUNFKCIgLSBkd0N1cnJWaXNpYmxlT3ZlcmxheXMgOiAlZFxuIiwgbHBjYXBzLT5kd0N1cnJWaXNpYmxlT3ZlcmxheXMpOwogICAgVFJBQ0UoIiAtIGR3TWluT3ZlcmxheVN0cmV0Y2ggOiAlZFxuIiwgbHBjYXBzLT5kd01pbk92ZXJsYXlTdHJldGNoKTsKICAgIFRSQUNFKCIgLSBkd01heE92ZXJsYXlTdHJldGNoIDogJWRcbiIsIGxwY2Fwcy0+ZHdNYXhPdmVybGF5U3RyZXRjaCk7CiAgICBUUkFDRSgiLi4uXG4iKTsKICAgIFRSQUNFKCIgLSBkZHNDYXBzIDogIik7IEREUkFXX2R1bXBfRERTQ0FQUzIoJmxwY2Fwcy0+ZGRzQ2Fwcyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdWx0aXBseV9tYXRyaXgKICoKICogTXVsdGlwbGllcyAyIDR4NCBtYXRyaWNlcyBzcmMxIGFuZCBzcmMyLCBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gZGVzdC4KICoKICogUGFyYW1zOgogKiAgZGVzdDogUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gbWF0cml4CiAqICBzcmMxOiBQb2ludGVyIHRvIHRoZSBmaXJzdCBzb3VyY2UgbWF0cml4CiAqICBzcmMyOiBQb2ludGVyIHRvIHRoZSBzZWNvbmQgc291cmNlIG1hdHJpeAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKbXVsdGlwbHlfbWF0cml4KEQzRE1BVFJJWCAqZGVzdCwKICAgICAgICAgICAgICAgIGNvbnN0IEQzRE1BVFJJWCAqc3JjMSwKICAgICAgICAgICAgICAgIGNvbnN0IEQzRE1BVFJJWCAqc3JjMikKewogICAgRDNETUFUUklYIHRlbXA7CgogICAgLyogTm93IGRvIHRoZSBtdWx0aXBsaWNhdGlvbiAnYnkgaGFuZCcuCiAgICAgICBJIGtub3cgdGhhdCBhbGwgdGhpcyBjb3VsZCBiZSBvcHRpbWlzZWQsIGJ1dCB0aGlzIHdpbGwgYmUgZG9uZSBsYXRlciA6LSkgKi8KICAgIHRlbXAuXzExID0gKHNyYzEtPl8xMSAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80MSAqIHNyYzItPl8xNCk7CiAgICB0ZW1wLl8yMSA9IChzcmMxLT5fMTEgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yMSAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzMxICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDEgKiBzcmMyLT5fMjQpOwogICAgdGVtcC5fMzEgPSAoc3JjMS0+XzExICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzM0KTsKICAgIHRlbXAuXzQxID0gKHNyYzEtPl8xMSAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80MSAqIHNyYzItPl80NCk7CgogICAgdGVtcC5fMTIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzExKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzE0KTsKICAgIHRlbXAuXzIyID0gKHNyYzEtPl8xMiAqIHNyYzItPl8yMSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzIyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fMjMpICsgKHNyYzEtPl80MiAqIHNyYzItPl8yNCk7CiAgICB0ZW1wLl8zMiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fMzQpOwogICAgdGVtcC5fNDIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzQ0KTsKCiAgICB0ZW1wLl8xMyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fMTEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl8xMikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzEzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fMTQpOwogICAgdGVtcC5fMjMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzI0KTsKICAgIHRlbXAuXzMzID0gKHNyYzEtPl8xMyAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzIzICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzMgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80MyAqIHNyYzItPl8zNCk7CiAgICB0ZW1wLl80MyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fNDEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl80MikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzQzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fNDQpOwoKICAgIHRlbXAuXzE0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80NCAqIHNyYzItPl8xNCk7CiAgICB0ZW1wLl8yNCA9IChzcmMxLT5fMTQgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yNCAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzM0ICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDQgKiBzcmMyLT5fMjQpOwogICAgdGVtcC5fMzQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzM0KTsKICAgIHRlbXAuXzQ0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80NCAqIHNyYzItPl80NCk7CgogICAgLyogQW5kIGNvcHkgdGhlIG5ldyBtYXRyaXggaW4gdGhlIGdvb2Qgc3RvcmFnZS4uICovCiAgICBtZW1jcHkoZGVzdCwgJnRlbXAsIDE2ICogc2l6ZW9mKEQzRFZBTFVFKSk7Cn0KCgpIUkVTVUxUCmhyX2RkcmF3X2Zyb21fd2luZWQzZChIUkVTVUxUIGhyKQp7CiAgICBzd2l0Y2goaHIpCiAgICB7CiAgICAgICAgY2FzZSBXSU5FRDNERVJSX0lOVkFMSURDQUxMOiByZXR1cm4gRERFUlJfSU5WQUxJRFBBUkFNUzsKICAgICAgICBkZWZhdWx0OiByZXR1cm4gaHI7CiAgICB9Cn0K