LyoKICogRGlyZWN0RHJhdyBoZWxwZXIgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAwIE1hcmN1cyBNZWlzc25lcgogKiBDb3B5cmlnaHQgKGMpIDE5OTggTGlvbmVsIFVsbWVyCiAqIENvcHlyaWdodCAoYykgMjAwMCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMgSW5jLgogKiBDb3B5cmlnaHQgKGMpIDIwMDYgU3RlZmFuIET2c2luZ2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCgojaW5jbHVkZSAiZGRyYXdfcHJpdmF0ZS5oIgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoZGRyYXcpOwoKdm9pZCBERFJBV19kdW1wX2ZsYWdzXyhEV09SRCBmbGFncywgY29uc3QgZmxhZ19pbmZvKiBuYW1lcywgc2l6ZV90IG51bV9uYW1lcywgaW50IG5ld2xpbmUpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFBpeGVsRm9ybWF0X1dpbmVEM0R0b0RECiAqCiAqIENvbnZlcnRzIGFuIFdJTkVEM0RGT1JNQVQgdmFsdWUgaW50byBhIEREUElYRUxGT1JNQVQgc3RydWN0dXJlCiAqCiAqIFBhcmFtczoKICogIEREUGl4ZWxGb3JtYXQ6IEFkZHJlc3Mgb2YgdGhlIHN0cnVjdHVyZSB0byB3cml0ZSB0aGUgcGl4ZWwgZm9ybWF0IHRvCiAqICBXaW5lRDNERm9ybWF0OiBTb3VyY2UgZm9ybWF0CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZApQaXhlbEZvcm1hdF9XaW5lRDNEdG9ERChERFBJWEVMRk9STUFUICpERFBpeGVsRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIFdpbmVEM0RGb3JtYXQpCnsKICAgIERXT1JEIFNpemUgPSBERFBpeGVsRm9ybWF0LT5kd1NpemU7CiAgICBUUkFDRSgiQ29udmVydGluZyBXSU5FRDNERk9STUFUICVkIHRvIEREUkFXXG4iLCBXaW5lRDNERm9ybWF0KTsKCiAgICBpZihTaXplPT0wKSByZXR1cm47CgogICAgbWVtc2V0KEREUGl4ZWxGb3JtYXQsIDB4MDAsIFNpemUpOwogICAgRERQaXhlbEZvcm1hdC0+ZHdTaXplID0gU2l6ZTsKICAgIHN3aXRjaChXaW5lRDNERm9ybWF0KQogICAgewogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4Qjg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMjQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwZmYwMDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDAwZmYwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjhHOEI4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBmZjAwMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBmZjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDAwMDBmZjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweGZmMDAwMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1g4UjhHOEI4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDMyOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHgwMGZmMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAwMGZmMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOEI4RzhSODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAzMjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDAwMDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwMDBmZjAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMGZmMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjVHNkI1OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHhGODAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwN0UwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDFGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YMVI1RzVCNToKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4N0MwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDNFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAxRjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTFSNUc1QjU6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQiB8IEREUEZfQUxQSEFQSVhFTFM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHg3QzAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwM0UwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID0gMHgwMDFGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9IDB4ODAwMDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BNFI0RzRCNDoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCIHwgRERQRl9BTFBIQVBJWEVMUzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDBGMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwRjA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMEY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHhGMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1IzRzNCMjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUkdCOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1JCaXRNYXNrID0gMHhFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MUM7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAzOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd0x1bWluYW5jZUFscGhhQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9QODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfUEFMRVRURUlOREVYRUQ4IHwgRERQRl9SR0I7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdSR0JCaXRDb3VudCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID0gMHgwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0FMUEhBOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3THVtaW5hbmNlQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjNHM0IyOgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9SR0IgfCBERFBGX0FMUEhBUElYRUxTOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9IDB4MDBFMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdHQml0TWFzayA9IDB4MDAxQzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9IDB4MDAwMzsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweEYwMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDRSNEc0QjQ6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1JHQjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1JHQkJpdENvdW50ID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPSAweDBGMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPSAweDAwRjA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPSAweDAwMEY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICByZXR1cm47CgogICAgICAgIC8qIEhvdyBhcmUgWiBidWZmZXIgYml0IGRlcHRoIGFuZCBTdGVuY2lsIGJ1ZmZlciBiaXQgZGVwdGggcmVsYXRlZD8KICAgICAgICAgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE2OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMTY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdaQml0TWFzayA9IDB4MDAwMEZGRkY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCWkJpdE1hc2sgPSAweDAwMDBGRkZGOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QzMjoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfWkJVRkZFUjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPSAwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDMyOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweEZGRkZGRkZGOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NC5kd1N0ZW5jaWxCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51NS5kd1JHQlpCaXRNYXNrID0gMHhGRkZGRkZGRjsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRYNFM0OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIC8qIFNob3VsZCBJIHNldCBkd1pCdWZmZXJCaXREZXB0aCB0byAzMiBoZXJlPyAqLwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDI0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFM4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSIHwgRERQRl9TVEVOQ0lMQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIC8qIFNob3VsZCBJIHNldCBkd1pCdWZmZXJCaXREZXB0aCB0byAzMiBoZXJlPyAqLwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCA9IDI0OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9IDg7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3WkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3U3RlbmNpbEJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3UkdCQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFg4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9aQlVGRkVSOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMjQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gODsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdaQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CgogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE1UzE6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX1pCVUZGRVIgfCBERFBGX1NURU5DSUxCVUZGRVI7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgLyogU2hvdWxkIEkgc2V0IGR3WkJ1ZmZlckJpdERlcHRoIHRvIDE2IGhlcmU/ICovCiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3WkJ1ZmZlckJpdERlcHRoID0gMTU7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3U3RlbmNpbEJpdERlcHRoID0gMTsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTMuZHdaQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdTdGVuY2lsQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVVlWWToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWVVZMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMzoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUNToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTVVMVEkyX0FSR0I6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0c4UjhfRzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjhHOF9COEc4OgogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZsYWdzID0gRERQRl9GT1VSQ0M7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gV2luZUQzREZvcm1hdDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIC8qIEx1bWluYW5jZSAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9MODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfTFVNSU5BTkNFOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9IDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQgPSA4OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0x1bWluYW5jZUJpdE1hc2sgPSAweGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAweDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU1LmR3THVtaW5hbmNlQWxwaGFCaXRNYXNrID0gMHgwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E0TDQ6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0FMUEhBUElYRUxTIHwgRERQRl9MVU1JTkFOQ0U7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCA9IDQ7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUyLmR3THVtaW5hbmNlQml0TWFzayA9IDB4MGY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweGYwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4TDg6CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgPSBERFBGX0FMUEhBUElYRUxTIHwgRERQRl9MVU1JTkFOQ0U7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCA9IDE2OwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51Mi5kd0x1bWluYW5jZUJpdE1hc2sgPSAweDAwZmY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnUzLmR3QnVtcER2Qml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9IDB4MDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweGZmMDA7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAvKiBCdW1wIG1hcHBpbmcgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjhVODoKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQlVNUERVRFY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrID0gICAgICAgICAweDAwMDAwMGZmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAgICAgICAgIDB4MDAwMGZmMDA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAgMHgwMDAwMDAwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0w2VjVVNToKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+ZHdGbGFncyA9IEREUEZfQlVNUERVRFY7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID0gMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgPSAxNjsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrID0gICAgICAgICAweDAwMDAwMDFmOwogICAgICAgICAgICBERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgPSAgICAgICAgIDB4MDAwMDAzZTA7CiAgICAgICAgICAgIEREUGl4ZWxGb3JtYXQtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2sgPSAgMHgwMDAwZmMwMDsKICAgICAgICAgICAgRERQaXhlbEZvcm1hdC0+dTUuZHdMdW1pbmFuY2VBbHBoYUJpdE1hc2sgPSAweDAwMDAwMDAwOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRVJSKCJDYW4ndCB0cmFuc2xhdGUgdGhpcyBQaXhlbGZvcm1hdCAlZFxuIiwgV2luZUQzREZvcm1hdCk7CiAgICB9CgogICAgaWYoVFJBQ0VfT04oZGRyYXcpKSB7CiAgICAgICAgVFJBQ0UoIlJldHVybmluZzogIik7CiAgICAgICAgRERSQVdfZHVtcF9waXhlbGZvcm1hdChERFBpeGVsRm9ybWF0KTsKICAgICAgICBUUkFDRSgiXG4iKTsKICAgIH0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUGl4ZWxGb3JtYXRfREQyV2luZUQzRAogKgogKiBSZWFkcyBhIEREUElYRUxGT1JNQVQgc3RydWN0dXJlIGFuZCByZXR1cm5zIHRoZSBlcXVhbCBXSU5FRDNERk9STUFUCiAqCiAqIFBhcmFtczoKICogIEREUGl4ZWxGb3JtYXQ6IFRoZSBzb3VyY2UgZm9ybWF0CiAqCiAqIFJldHVybnM6CiAqICBUaGUgV0lORUQzREZPUk1BVCBlcXVhbCB0byB0aGUgRERyYXcgZm9ybWF0CiAqICBXSU5FRDNERk1UX1VOS05PV04gaWYgYSBtYXRjaGluZyBmb3JtYXQgd2Fzbid0IGZvdW5kCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KV0lORUQzREZPUk1BVApQaXhlbEZvcm1hdF9ERDJXaW5lRDNEKEREUElYRUxGT1JNQVQgKkREUGl4ZWxGb3JtYXQpCnsKICAgIFRSQUNFKCJDb252ZXJ0IGEgRGlyZWN0RHJhdyBQaXhlbGZvcm1hdCB0byBhIFdpbmVEM0QgUGl4ZWxmb3JtYXRcbiIpOyAgICAKICAgIGlmKFRSQUNFX09OKGRkcmF3KSkKICAgIHsKICAgICAgICBERFJBV19kdW1wX3BpeGVsZm9ybWF0KEREUGl4ZWxGb3JtYXQpOwogICAgICAgIFRSQUNFKCJcbiIpOwogICAgfQoKICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX1BBTEVUVEVJTkRFWEVEOCkKICAgIHsKICAgICAgICByZXR1cm4gV0lORUQzREZNVF9QODsKICAgIH0KICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIChERFBGX1BBTEVUVEVJTkRFWEVEMSB8IEREUEZfUEFMRVRURUlOREVYRUQyIHwgRERQRl9QQUxFVFRFSU5ERVhFRDQpICkKICAgIHsKICAgICAgICBGSVhNRSgiRERQRl9QQUxFVFRFSU5ERVhFRDEgdG8gRERQRl9QQUxFVFRFSU5ERVhFRDQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgV2luZUQzRCAoeWV0KS4gUmV0dXJuaW5nIFdJTkVEM0RGTVRfUDhcbiIpOwogICAgICAgIHJldHVybiBXSU5FRDNERk1UX1A4OwogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9SR0IpCiAgICB7CiAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3UkdCQml0Q291bnQpCiAgICAgICAgewogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBvbmx5IGZvcm1hdCB0aGF0IGNhbiBtYXRjaCBoZXJlICovCiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SM0czQjI7CgogICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgQ29sb3IgbWFza3MgKi8KICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweEY4MDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUzLmR3R0JpdE1hc2sgPT0gMHgwN0UwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0JCaXRNYXNrID09IDB4MDAxRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1I1RzZCNTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPT0gMHg3QzAwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDNFMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMUYpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHg4MDAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTFSNUc1QjU7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9YMVI1RzVCNTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPT0gMHgwRjAwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDBGMCkgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMEYpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTUuZHdSR0JBbHBoYUJpdE1hc2sgPT0gMHhGMDAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQTRSNEc0QjQ7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9YNFI0RzRCNDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiggKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0FMUEhBUElYRUxTKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEZGMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnUyLmR3UkJpdE1hc2sgPT0gMHgwMEUwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDAxQykgJiYKICAgICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCQml0TWFzayA9PSAweDAwMDMpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BOFIzRzNCMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIEVSUigiMTYgYml0IFJHQiBQaXhlbCBmb3JtYXQgZG9lcyBub3QgbWF0Y2hcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SOEc4Qjg7CgogICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgQ29sb3IgbWFza3MgKi8KICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+dTIuZHdSQml0TWFzayA9PSAweDAwRkYwMDAwKSAmJgogICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0dCaXRNYXNrID09IDB4MDAwMEZGMDApICYmCiAgICAgICAgICAgICAgICAgICAgKEREUGl4ZWxGb3JtYXQtPnU0LmR3QkJpdE1hc2sgPT0gMHgwMDAwMDBGRikgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NS5kd1JHQkFscGhhQml0TWFzayA9PSAweEZGMDAwMDAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfQThSOEc4Qjg7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9YOFI4RzhCODsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBFUlIoIjMyIGJpdCBSR0IgcGl4ZWwgZm9ybWF0IGRvZXMgbm90IG1hdGNoXG4iKTsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBFUlIoIkludmFsaWQgZHdSR0JCaXRDb3VudCBpbiBQaXhlbGZvcm1hdCBzdHJ1Y3R1cmVcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCAoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEEpICkKICAgIHsKICAgICAgICAvKiBBbHBoYSBvbmx5IFBpeGVsZm9ybWF0ICovCiAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCkKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBFUlIoIlVuc3VwcG9ydGVkIEFscGhhLU9ubHkgYml0IGRlcHRoIDB4JWx4XG4iLCBERFBpeGVsRm9ybWF0LT51MS5kd0FscGhhQml0RGVwdGgpOwogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BODsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBFUlIoIkludmFsaWQgQWxwaGFCaXREZXB0aCBpbiBBbHBoYS1Pbmx5IFBpeGVsZm9ybWF0XG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9MVU1JTkFOQ0UpCiAgICB7CiAgICAgICAgLyogTHVtaW5hbmNlLW9ubHkgb3IgbHVtaW5hbmNlLWFscGhhICovCiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpCiAgICAgICAgewogICAgICAgICAgICAvKiBMdW1pbmFuY2Ugd2l0aCBBbHBoYSAqLwogICAgICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdMdW1pbmFuY2VCaXRDb3VudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCA9PSA0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BNEw0OwogICAgICAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBBbHBoYSAvIEx1bWluYW5jZSBiaXQgZGVwdGggY29tYmluYXRpb25cbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CgogICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgIEVSUigiQSBsdW1pbmFuY2UgUGl4ZWxmb3JtYXQgc2hvdWxkbid0IGhhdmUgNiBsdW1pbmFuY2UgYml0cy4gUmV0dXJuaW5nIEQzREZNVF9MNlY1VTUgZm9yIG5vdyEhXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9MNlY1VTU7CgogICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPnUxLmR3QWxwaGFCaXREZXB0aCA9PSA4KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9BOEw4OwogICAgICAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBBbHBoYSAvIEx1bWluY2FzZSBiaXQgZGVwdGggY29tYmluYXRpb25cbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLyogTHVtaW5hbmNlLW9ubHkgKi8KICAgICAgICAgICAgc3dpdGNoKEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICBFUlIoIkEgbHVtaW5hbmNlIFBpeGVsZm9ybWF0IHNob3VsZG4ndCBoYXZlIDYgbHVtaW5hbmNlIGJpdHMuIFJldHVybmluZyBEM0RGTVRfTDZWNVU1IGZvciBub3chIVxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfTDZWNVU1OwoKICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9MODsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBsdW1pbmFuY2Utb25seSBiaXQgZGVwdGggMHglbHhcbiIsIEREUGl4ZWxGb3JtYXQtPnUxLmR3THVtaW5hbmNlQml0Q291bnQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZihERFBpeGVsRm9ybWF0LT5kd0ZsYWdzICYgRERQRl9aQlVGRkVSKQogICAgewogICAgICAgIC8qIFogYnVmZmVyICovCiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfU1RFTkNJTEJVRkZFUikKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaChERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgIEVSUigiOCBCaXRzIForU3RlbmNpbCBidWZmZXIgcGl4ZWxmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gUmV0dXJuaW5nIFdJTkVEM0RGTVRfVU5LTk9XTlxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9PSAxKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMTVTMTsKCiAgICAgICAgICAgICAgICAgICAgRVJSKCJEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgYSAxNiBiaXQgWiBidWZmZXIgd2l0aCAlbGQgYml0IHN0ZW5jaWwgYnVmZmVyIHBpeGVsZm9ybWF0XG4iLCBERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKCiAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgIEVSUigiRG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGEgMjQgYml0IGRlcHRoIGJ1ZmZlciB3aXRoIHN0ZW5jaWwgYml0c1xuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0Uzg7CgogICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICBpZihERFBpeGVsRm9ybWF0LT51Mi5kd1N0ZW5jaWxCaXREZXB0aCA9PSA4KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMjRTODsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0QyNFg0UzQ7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVua25vd24gWiBidWZmZXIgZGVwdGggJWxkXG4iLCBERFBpeGVsRm9ybWF0LT51MS5kd1pCdWZmZXJCaXREZXB0aCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2goRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICBFUlIoIjggQml0IFogYnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZC4gVHJ5aW5nIGEgMTYgQml0IG9uZVxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDE2OwoKICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDE2OwoKICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRDI0WDg7CgogICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EMzI7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBFUlIoIlVuc3VwcG9ydGVkIFogYnVmZmVyIGRlcHRoICVsZFxuIiwgRERQaXhlbEZvcm1hdC0+dTEuZHdaQnVmZmVyQml0RGVwdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKEREUGl4ZWxGb3JtYXQtPmR3RmxhZ3MgJiBERFBGX0ZPVVJDQykKICAgIHsKICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdVJywgJ1knLCAnVicsICdZJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9VWVZZOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdZJywgJ1UnLCAnWScsICcyJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9ZVVkyOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcxJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQxOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICcyJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9EWFQyOwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICczJykpCiAgICAgICAgewogICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDM7CiAgICAgICAgfQogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzQnKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX0RYVDQ7CiAgICAgICAgfQogICAgICAgIGlmKEREUGl4ZWxGb3JtYXQtPmR3Rm91ckNDID09IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzUnKSkKICAgICAgICB7CgkgICAgcmV0dXJuIFdJTkVEM0RGTVRfRFhUNTsKICAgICAgICB9CiAgICAgICAgaWYoRERQaXhlbEZvcm1hdC0+ZHdGb3VyQ0MgPT0gTUFLRUZPVVJDQygnRycsICdSJywgJ0cnLCAnQicpKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RGTVRfRzhSOF9HOEI4OwogICAgICAgIH0KICAgICAgICBpZihERFBpeGVsRm9ybWF0LT5kd0ZvdXJDQyA9PSBNQUtFRk9VUkNDKCdSJywgJ0cnLCAnQicsICdHJykpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9SOEc4X0I4Rzg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBXSU5FRDNERk1UX1VOS05PV047ICAvKiBBYnVzZSB0aGlzIGFzIGEgZXJyb3IgdmFsdWUgKi8KICAgIH0KICAgIGVsc2UgaWYoRERQaXhlbEZvcm1hdC0+ZHdGbGFncyAmIEREUEZfQlVNUERVRFYpCiAgICB7CiAgICAgICAgaWYoIChERFBpeGVsRm9ybWF0LT51MS5kd0J1bXBCaXRDb3VudCAgICAgICAgID09IDE2ICAgICAgICApICYmCiAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51Mi5kd0J1bXBEdUJpdE1hc2sgICAgICAgID09IDB4MDAwMDAwZmYpICYmCiAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51My5kd0J1bXBEdkJpdE1hc2sgICAgICAgID09IDB4MDAwMGZmMDApICYmCiAgICAgICAgICAgIChERFBpeGVsRm9ybWF0LT51NC5kd0J1bXBMdW1pbmFuY2VCaXRNYXNrID09IDB4MDAwMDAwMDApICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBXSU5FRDNERk1UX1Y4VTg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCAoRERQaXhlbEZvcm1hdC0+dTEuZHdCdW1wQml0Q291bnQgICAgICAgICA9PSAxNiAgICAgICAgKSAmJgogICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTIuZHdCdW1wRHVCaXRNYXNrICAgICAgICA9PSAweDAwMDAwMDFmKSAmJgogICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTMuZHdCdW1wRHZCaXRNYXNrICAgICAgICA9PSAweDAwMDAwM2UwKSAmJgogICAgICAgICAgICAgICAgICAoRERQaXhlbEZvcm1hdC0+dTQuZHdCdW1wTHVtaW5hbmNlQml0TWFzayA9PSAweDAwMDBmYzAwKSApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gV0lORUQzREZNVF9MNlY1VTU7CiAgICAgICAgfQogICAgfQoKICAgIEVSUigiVW5rbm93biBQaXhlbGZvcm1hdCFcbiIpOwogICAgcmV0dXJuIFdJTkVEM0RGTVRfVU5LTk9XTjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZhcmlvdXMgZHVtcGluZyBmdW5jdGlvbnMuCiAqCiAqIFRoZXkgd3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgZnVuY3Rpb24gdG8gYSBEUFJJTlRGLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCkREUkFXX2R1bXBfRFdPUkQoY29uc3Qgdm9pZCAqaW4pCnsKICAgIERQUklOVEYoIiVsZCIsICooKGNvbnN0IERXT1JEICopIGluKSk7Cn0Kc3RhdGljIHZvaWQKRERSQVdfZHVtcF9QVFIoY29uc3Qgdm9pZCAqaW4pCnsKICAgIERQUklOVEYoIiVwIiwgKigoY29uc3Qgdm9pZCAqIGNvbnN0KikgaW4pKTsKfQp2b2lkCkREUkFXX2R1bXBfRERDT0xPUktFWShjb25zdCBERENPTE9SS0VZICpkZGNrKQp7CiAgICBEUFJJTlRGKCIgTG93IDogJWxkICAtIEhpZ2ggOiAlbGQiLCBkZGNrLT5kd0NvbG9yU3BhY2VMb3dWYWx1ZSwgZGRjay0+ZHdDb2xvclNwYWNlSGlnaFZhbHVlKTsKfQp2b2lkIEREUkFXX2R1bXBfRERTQ0FQUzIoY29uc3QgRERTQ0FQUzIgKmluKQp7CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPSB7CiAgICAgICAgRkUoRERTQ0FQU19SRVNFUlZFRDEpLAogICAgICAgIEZFKEREU0NBUFNfQUxQSEEpLAogICAgICAgIEZFKEREU0NBUFNfQkFDS0JVRkZFUiksCiAgICAgICAgRkUoRERTQ0FQU19DT01QTEVYKSwKICAgICAgICBGRShERFNDQVBTX0ZMSVApLAogICAgICAgIEZFKEREU0NBUFNfRlJPTlRCVUZGRVIpLAogICAgICAgIEZFKEREU0NBUFNfT0ZGU0NSRUVOUExBSU4pLAogICAgICAgIEZFKEREU0NBUFNfT1ZFUkxBWSksCiAgICAgICAgRkUoRERTQ0FQU19QQUxFVFRFKSwKICAgICAgICBGRShERFNDQVBTX1BSSU1BUllTVVJGQUNFKSwKICAgICAgICBGRShERFNDQVBTX1BSSU1BUllTVVJGQUNFTEVGVCksCiAgICAgICAgRkUoRERTQ0FQU19TWVNURU1NRU1PUlkpLAogICAgICAgIEZFKEREU0NBUFNfVEVYVFVSRSksCiAgICAgICAgRkUoRERTQ0FQU18zRERFVklDRSksCiAgICAgICAgRkUoRERTQ0FQU19WSURFT01FTU9SWSksCiAgICAgICAgRkUoRERTQ0FQU19WSVNJQkxFKSwKICAgICAgICBGRShERFNDQVBTX1dSSVRFT05MWSksCiAgICAgICAgRkUoRERTQ0FQU19aQlVGRkVSKSwKICAgICAgICBGRShERFNDQVBTX09XTkRDKSwKICAgICAgICBGRShERFNDQVBTX0xJVkVWSURFTyksCiAgICAgICAgRkUoRERTQ0FQU19IV0NPREVDKSwKICAgICAgICBGRShERFNDQVBTX01PREVYKSwKICAgICAgICBGRShERFNDQVBTX01JUE1BUCksCiAgICAgICAgRkUoRERTQ0FQU19SRVNFUlZFRDIpLAogICAgICAgIEZFKEREU0NBUFNfQUxMT0NPTkxPQUQpLAogICAgICAgIEZFKEREU0NBUFNfVklERU9QT1JUKSwKICAgICAgICBGRShERFNDQVBTX0xPQ0FMVklETUVNKSwKICAgICAgICBGRShERFNDQVBTX05PTkxPQ0FMVklETUVNKSwKICAgICAgICBGRShERFNDQVBTX1NUQU5EQVJEVkdBTU9ERSksCiAgICAgICAgRkUoRERTQ0FQU19PUFRJTUlaRUQpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczJbXSA9IHsKICAgICAgICBGRShERFNDQVBTMl9IQVJEV0FSRURFSU5URVJMQUNFKSwKICAgICAgICBGRShERFNDQVBTMl9ISU5URFlOQU1JQyksCiAgICAgICAgRkUoRERTQ0FQUzJfSElOVFNUQVRJQyksCiAgICAgICAgRkUoRERTQ0FQUzJfVEVYVFVSRU1BTkFHRSksCiAgICAgICAgRkUoRERTQ0FQUzJfUkVTRVJWRUQxKSwKICAgICAgICBGRShERFNDQVBTMl9SRVNFUlZFRDIpLAogICAgICAgIEZFKEREU0NBUFMyX09QQVFVRSksCiAgICAgICAgRkUoRERTQ0FQUzJfSElOVEFOVElBTElBU0lORyksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUCksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9QT1NJVElWRVgpLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfTkVHQVRJVkVYKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX1BPU0lUSVZFWSksCiAgICAgICAgRkUoRERTQ0FQUzJfQ1VCRU1BUF9ORUdBVElWRVkpLAogICAgICAgIEZFKEREU0NBUFMyX0NVQkVNQVBfUE9TSVRJVkVaKSwKICAgICAgICBGRShERFNDQVBTMl9DVUJFTUFQX05FR0FUSVZFWiksCiAgICAgICAgRkUoRERTQ0FQUzJfTUlQTUFQU1VCTEVWRUwpLAogICAgICAgIEZFKEREU0NBUFMyX0QzRFRFWFRVUkVNQU5BR0UpLAogICAgICAgIEZFKEREU0NBUFMyX0RPTk9UUEVSU0lTVCksCiAgICAgICAgRkUoRERTQ0FQUzJfU1RFUkVPU1VSRkFDRUxFRlQpCiAgICB9OwoKICAgIEREUkFXX2R1bXBfZmxhZ3NfKGluLT5kd0NhcHMsIGZsYWdzLCBzaXplb2YoZmxhZ3MpL3NpemVvZihmbGFnc1swXSksIDApOwogICAgRERSQVdfZHVtcF9mbGFnc18oaW4tPmR3Q2FwczIsIGZsYWdzMiwgc2l6ZW9mKGZsYWdzMikvc2l6ZW9mKGZsYWdzMlswXSksIDApOwp9Cgp2b2lkCkREUkFXX2R1bXBfRERTQ0FQUyhjb25zdCBERFNDQVBTICppbikKewogICAgRERTQ0FQUzIgaW5fYmlzOwoKICAgIGluX2Jpcy5kd0NhcHMgPSBpbi0+ZHdDYXBzOwogICAgaW5fYmlzLmR3Q2FwczIgPSAwOwogICAgaW5fYmlzLmR3Q2FwczMgPSAwOwogICAgaW5fYmlzLmR3Q2FwczQgPSAwOwoKICAgIEREUkFXX2R1bXBfRERTQ0FQUzIoJmluX2Jpcyk7Cn0KCnZvaWQKRERSQVdfZHVtcF9mbGFnc18oRFdPUkQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYWdfaW5mbyogbmFtZXMsCiAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fbmFtZXMsCiAgICAgICAgICAgICAgICAgIGludCBuZXdsaW5lKQp7CiAgICB1bnNpZ25lZCBpbnQJaTsKCiAgICBmb3IgKGk9MDsgaSA8IG51bV9uYW1lczsgaSsrKQogICAgICAgIGlmICgoZmxhZ3MgJiBuYW1lc1tpXS52YWwpIHx8ICAgICAgLyogc3RhbmRhcmQgZmxhZyB2YWx1ZSAqLwogICAgICAgICAgICAoKCFmbGFncykgJiYgKCFuYW1lc1tpXS52YWwpKSkgLyogemVybyB2YWx1ZSBvbmx5ICovCiAgICAgICAgICAgIERQUklOVEYoIiVzICIsIG5hbWVzW2ldLm5hbWUpOwoKICAgIGlmIChuZXdsaW5lKQogICAgICAgIERQUklOVEYoIlxuIik7Cn0KCnZvaWQKRERSQVdfZHVtcF9waXhlbGZvcm1hdF9mbGFnKERXT1JEIGZsYWdtYXNrKQp7CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQogICAgICAgIHsKICAgICAgICAgICAgRkUoRERQRl9BTFBIQVBJWEVMUyksCiAgICAgICAgICAgIEZFKEREUEZfQUxQSEEpLAogICAgICAgICAgICBGRShERFBGX0ZPVVJDQyksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQ0KSwKICAgICAgICAgICAgRkUoRERQRl9QQUxFVFRFSU5ERVhFRFRPOCksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQ4KSwKICAgICAgICAgICAgRkUoRERQRl9SR0IpLAogICAgICAgICAgICBGRShERFBGX0NPTVBSRVNTRUQpLAogICAgICAgICAgICBGRShERFBGX1JHQlRPWVVWKSwKICAgICAgICAgICAgRkUoRERQRl9ZVVYpLAogICAgICAgICAgICBGRShERFBGX1pCVUZGRVIpLAogICAgICAgICAgICBGRShERFBGX1BBTEVUVEVJTkRFWEVEMSksCiAgICAgICAgICAgIEZFKEREUEZfUEFMRVRURUlOREVYRUQyKSwKICAgICAgICAgICAgRkUoRERQRl9aUElYRUxTKQogICAgfTsKCiAgICBERFJBV19kdW1wX2ZsYWdzXyhmbGFnbWFzaywgZmxhZ3MsIHNpemVvZihmbGFncykvc2l6ZW9mKGZsYWdzWzBdKSwgMCk7Cn0KCnZvaWQKRERSQVdfZHVtcF9tZW1iZXJzKERXT1JEIGZsYWdzLAogICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbWJlcl9pbmZvKiBtZW1zLAogICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9tZW1zKQp7CiAgICB1bnNpZ25lZCBpbnQgaTsKCiAgICBmb3IgKGk9MDsgaSA8IG51bV9tZW1zOyBpKyspCiAgICB7CiAgICAgICAgaWYgKG1lbXNbaV0udmFsICYgZmxhZ3MpCiAgICAgICAgewogICAgICAgICAgICBEUFJJTlRGKCIgLSAlcyA6ICIsIG1lbXNbaV0ubmFtZSk7CiAgICAgICAgICAgIG1lbXNbaV0uZnVuYygoY29uc3QgY2hhciAqKWRhdGEgKyBtZW1zW2ldLm9mZnNldCk7CiAgICAgICAgICAgIERQUklOVEYoIlxuIik7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkCkREUkFXX2R1bXBfcGl4ZWxmb3JtYXQoY29uc3QgRERQSVhFTEZPUk1BVCAqcGYpCnsKICAgIERQUklOVEYoIiggIik7CiAgICBERFJBV19kdW1wX3BpeGVsZm9ybWF0X2ZsYWcocGYtPmR3RmxhZ3MpOwogICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9GT1VSQ0MpCiAgICB7CiAgICAgICAgRFBSSU5URigiLCBkd0ZvdXJDQyBjb2RlICclYyVjJWMlYycgKDB4JTA4bHgpIC0gJWxkIGJpdHMgcGVyIHBpeGVsIiwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSggcGYtPmR3Rm91ckNDICAgICAmMHhmZiksCiAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoKHBmLT5kd0ZvdXJDQz4+IDgpJjB4ZmYpLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKChwZi0+ZHdGb3VyQ0M+PjE2KSYweGZmKSwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKSgocGYtPmR3Rm91ckNDPj4yNCkmMHhmZiksCiAgICAgICAgICAgICAgICBwZi0+ZHdGb3VyQ0MsCiAgICAgICAgICAgICAgICBwZi0+dTEuZHdZVVZCaXRDb3VudAogICAgICAgICk7CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX1JHQikKICAgIHsKICAgICAgICBjb25zdCBjaGFyICpjbWQ7CiAgICAgICAgRFBSSU5URigiLCBSR0IgYml0czogJWxkLCAiLCBwZi0+dTEuZHdSR0JCaXRDb3VudCk7CiAgICAgICAgc3dpdGNoIChwZi0+dTEuZHdSR0JCaXRDb3VudCkKICAgICAgICB7CiAgICAgICAgY2FzZSA0OiBjbWQgPSAiJTFseCI7IGJyZWFrOwogICAgICAgIGNhc2UgODogY21kID0gIiUwMmx4IjsgYnJlYWs7CiAgICAgICAgY2FzZSAxNjogY21kID0gIiUwNGx4IjsgYnJlYWs7CiAgICAgICAgY2FzZSAyNDogY21kID0gIiUwNmx4IjsgYnJlYWs7CiAgICAgICAgY2FzZSAzMjogY21kID0gIiUwOGx4IjsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogRVJSKCJVbmV4cGVjdGVkIGJpdCBkZXB0aCAhXG4iKTsgY21kID0gIiVkIjsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIERQUklOVEYoIiBSICIpOyBEUFJJTlRGKGNtZCwgcGYtPnUyLmR3UkJpdE1hc2spOwogICAgICAgIERQUklOVEYoIiBHICIpOyBEUFJJTlRGKGNtZCwgcGYtPnUzLmR3R0JpdE1hc2spOwogICAgICAgIERQUklOVEYoIiBCICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU0LmR3QkJpdE1hc2spOwogICAgICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfQUxQSEFQSVhFTFMpCiAgICAgICAgewogICAgICAgICAgICBEUFJJTlRGKCIgQSAiKTsgRFBSSU5URihjbWQsIHBmLT51NS5kd1JHQkFscGhhQml0TWFzayk7CiAgICAgICAgfQogICAgICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfWlBJWEVMUykKICAgICAgICB7CiAgICAgICAgICAgIERQUklOVEYoIiBaICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU1LmR3UkdCWkJpdE1hc2spOwogICAgICAgIH0KICAgIH0KICAgIGlmIChwZi0+ZHdGbGFncyAmIEREUEZfWkJVRkZFUikKICAgIHsKICAgICAgICBEUFJJTlRGKCIsIFogYml0cyA6ICVsZCIsIHBmLT51MS5kd1pCdWZmZXJCaXREZXB0aCk7CiAgICB9CiAgICBpZiAocGYtPmR3RmxhZ3MgJiBERFBGX0FMUEhBKQogICAgewogICAgICAgIERQUklOVEYoIiwgQWxwaGEgYml0cyA6ICVsZCIsIHBmLT51MS5kd0FscGhhQml0RGVwdGgpOwogICAgfQogICAgaWYgKHBmLT5kd0ZsYWdzICYgRERQRl9CVU1QRFVEVikKICAgIHsKICAgICAgICBjb25zdCBjaGFyICpjbWQgPSAiJTA4bHgiOwogICAgICAgIERQUklOVEYoIiwgQnVtcCBiaXRzOiAlbGQsICIsIHBmLT51MS5kd0J1bXBCaXRDb3VudCk7CiAgICAgICAgRFBSSU5URigiIFUgIik7IERQUklOVEYoY21kLCBwZi0+dTIuZHdCdW1wRHVCaXRNYXNrKTsKICAgICAgICBEUFJJTlRGKCIgViAiKTsgRFBSSU5URihjbWQsIHBmLT51My5kd0J1bXBEdkJpdE1hc2spOwogICAgICAgIERQUklOVEYoIiBMICIpOyBEUFJJTlRGKGNtZCwgcGYtPnU0LmR3QnVtcEx1bWluYW5jZUJpdE1hc2spOwogICAgfQogICAgRFBSSU5URigiKSIpOwp9Cgp2b2lkIEREUkFXX2R1bXBfc3VyZmFjZV9kZXNjKGNvbnN0IEREU1VSRkFDRURFU0MyICpscGRkc2QpCnsKI2RlZmluZSBTVFJVQ1QgRERTVVJGQUNFREVTQzIKICAgIHN0YXRpYyBjb25zdCBtZW1iZXJfaW5mbyBtZW1iZXJzW10gPQogICAgICAgIHsKICAgICAgICAgICAgTUUoRERTRF9IRUlHSFQsIEREUkFXX2R1bXBfRFdPUkQsIGR3SGVpZ2h0KSwKICAgICAgICAgICAgTUUoRERTRF9XSURUSCwgRERSQVdfZHVtcF9EV09SRCwgZHdXaWR0aCksCiAgICAgICAgICAgIE1FKEREU0RfUElUQ0gsIEREUkFXX2R1bXBfRFdPUkQsIHUxIC8qIGxQaXRjaCAqLyksCiAgICAgICAgICAgIE1FKEREU0RfTElORUFSU0laRSwgRERSQVdfZHVtcF9EV09SRCwgdTEgLyogZHdMaW5lYXJTaXplICovKSwKICAgICAgICAgICAgTUUoRERTRF9CQUNLQlVGRkVSQ09VTlQsIEREUkFXX2R1bXBfRFdPUkQsIGR3QmFja0J1ZmZlckNvdW50KSwKICAgICAgICAgICAgTUUoRERTRF9NSVBNQVBDT1VOVCwgRERSQVdfZHVtcF9EV09SRCwgdTIgLyogZHdNaXBNYXBDb3VudCAqLyksCiAgICAgICAgICAgIE1FKEREU0RfWkJVRkZFUkJJVERFUFRILCBERFJBV19kdW1wX0RXT1JELCB1MiAvKiBkd1pCdWZmZXJCaXREZXB0aCAqLyksIC8qIFRoaXMgaXMgZm9yICdvbGQtc3R5bGUnIEQzRCAqLwogICAgICAgICAgICBNRShERFNEX1JFRlJFU0hSQVRFLCBERFJBV19kdW1wX0RXT1JELCB1MiAvKiBkd1JlZnJlc2hSYXRlICovKSwKICAgICAgICAgICAgTUUoRERTRF9BTFBIQUJJVERFUFRILCBERFJBV19kdW1wX0RXT1JELCBkd0FscGhhQml0RGVwdGgpLAogICAgICAgICAgICBNRShERFNEX0xQU1VSRkFDRSwgRERSQVdfZHVtcF9QVFIsIGxwU3VyZmFjZSksCiAgICAgICAgICAgIE1FKEREU0RfQ0tERVNUT1ZFUkxBWSwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCB1MyAvKiBkZGNrQ0tEZXN0T3ZlcmxheSAqLyksCiAgICAgICAgICAgIE1FKEREU0RfQ0tERVNUQkxULCBERFJBV19kdW1wX0REQ09MT1JLRVksIGRkY2tDS0Rlc3RCbHQpLAogICAgICAgICAgICBNRShERFNEX0NLU1JDT1ZFUkxBWSwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tTcmNPdmVybGF5KSwKICAgICAgICAgICAgTUUoRERTRF9DS1NSQ0JMVCwgRERSQVdfZHVtcF9ERENPTE9SS0VZLCBkZGNrQ0tTcmNCbHQpLAogICAgICAgICAgICBNRShERFNEX1BJWEVMRk9STUFULCBERFJBV19kdW1wX3BpeGVsZm9ybWF0LCB1NCAvKiBkZHBmUGl4ZWxGb3JtYXQgKi8pCiAgICAgICAgfTsKICAgIHN0YXRpYyBjb25zdCBtZW1iZXJfaW5mbyBtZW1iZXJzX2NhcHNbXSA9CiAgICAgICAgewogICAgICAgICAgICBNRShERFNEX0NBUFMsIEREUkFXX2R1bXBfRERTQ0FQUywgZGRzQ2FwcykKICAgICAgICB9OwogICAgc3RhdGljIGNvbnN0IG1lbWJlcl9pbmZvIG1lbWJlcnNfY2FwczJbXSA9CiAgICAgICAgewogICAgICAgICAgICBNRShERFNEX0NBUFMsIEREUkFXX2R1bXBfRERTQ0FQUzIsIGRkc0NhcHMpCiAgICAgICAgfTsKI3VuZGVmIFNUUlVDVAoKICAgIGlmIChOVUxMID09IGxwZGRzZCkKICAgIHsKICAgICAgICBEUFJJTlRGKCIobnVsbClcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBpZiAobHBkZHNkLT5kd1NpemUgPj0gc2l6ZW9mKEREU1VSRkFDRURFU0MyKSkKICAgICAgewogICAgICAgICAgRERSQVdfZHVtcF9tZW1iZXJzKGxwZGRzZC0+ZHdGbGFncywgbHBkZHNkLCBtZW1iZXJzX2NhcHMyLCAxKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgIEREUkFXX2R1bXBfbWVtYmVycyhscGRkc2QtPmR3RmxhZ3MsIGxwZGRzZCwgbWVtYmVyc19jYXBzLCAxKTsKICAgICAgfQogICAgICBERFJBV19kdW1wX21lbWJlcnMobHBkZHNkLT5kd0ZsYWdzLCBscGRkc2QsIG1lbWJlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lbWJlcnMpL3NpemVvZihtZW1iZXJzWzBdKSk7CiAgICB9Cn0KCnZvaWQKZHVtcF9EM0RNQVRSSVgoRDNETUFUUklYICptYXQpCnsKICAgIERQUklOVEYoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzExLCBtYXQtPl8xMiwgbWF0LT5fMTMsIG1hdC0+XzE0KTsKICAgIERQUklOVEYoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzIxLCBtYXQtPl8yMiwgbWF0LT5fMjMsIG1hdC0+XzI0KTsKICAgIERQUklOVEYoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzMxLCBtYXQtPl8zMiwgbWF0LT5fMzMsIG1hdC0+XzM0KTsKICAgIERQUklOVEYoIiAgJWYgJWYgJWYgJWZcbiIsIG1hdC0+XzQxLCBtYXQtPl80MiwgbWF0LT5fNDMsIG1hdC0+XzQ0KTsKfQoKRFdPUkQKZ2V0X2ZsZXhpYmxlX3ZlcnRleF9zaXplKERXT1JEIGQzZHZ0VmVydGV4VHlwZSkKewogICAgRFdPUkQgc2l6ZSA9IDA7CiAgICBpbnQgaTsKCiAgICBpZiAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX05PUk1BTCkgc2l6ZSArPSAzICogc2l6ZW9mKEQzRFZBTFVFKTsKICAgIGlmIChkM2R2dFZlcnRleFR5cGUgJiBEM0RGVkZfRElGRlVTRSkgc2l6ZSArPSBzaXplb2YoRFdPUkQpOwogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9TUEVDVUxBUikgc2l6ZSArPSBzaXplb2YoRFdPUkQpOwogICAgaWYgKGQzZHZ0VmVydGV4VHlwZSAmIEQzREZWRl9SRVNFUlZFRDEpIHNpemUgKz0gc2l6ZW9mKERXT1JEKTsKICAgIHN3aXRjaCAoZDNkdnRWZXJ0ZXhUeXBlICYgRDNERlZGX1BPU0lUSU9OX01BU0spCiAgICB7CiAgICAgICAgY2FzZSBEM0RGVkZfWFlaOiBzaXplICs9IDMgKiBzaXplb2YoRDNEVkFMVUUpOyBicmVhazsKICAgICAgICBjYXNlIEQzREZWRl9YWVpSSFc6IHNpemUgKz0gNCAqIHNpemVvZihEM0RWQUxVRSk7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IFRSQUNFKCIgbWF0cml4IHdlaWdodGluZyBub3QgaGFuZGxlZCB5ZXQuLi5cbiIpOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IEdFVF9URVhDT1VOVF9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUpOyBpKyspCiAgICB7CiAgICAgICAgc2l6ZSArPSBHRVRfVEVYQ09PUkRfU0laRV9GUk9NX0ZWRihkM2R2dFZlcnRleFR5cGUsIGkpICogc2l6ZW9mKEQzRFZBTFVFKTsKICAgIH0KCiAgICByZXR1cm4gc2l6ZTsKfQoKdm9pZCBERFJBV19Db252ZXJ0X0REU0NBUFNfMV9Ub18yKGNvbnN0IEREU0NBUFMqIHBJbiwgRERTQ0FQUzIqIHBPdXQpCnsKICAgIC8qIDIgYWRkcyB0aHJlZSBhZGRpdGlvbmFsIGNhcHMgZmllbGRzIHRvIHRoZSBlbmQuIEJvdGggdmVyc2lvbnMKICAgICAqIGFyZSB1bnZlcnNpb25lZC4gKi8KICAgIHBPdXQtPmR3Q2FwcyA9IHBJbi0+ZHdDYXBzOwogICAgcE91dC0+ZHdDYXBzMiA9IDA7CiAgICBwT3V0LT5kd0NhcHMzID0gMDsKICAgIHBPdXQtPmR3Q2FwczQgPSAwOwp9Cgp2b2lkIEREUkFXX0NvbnZlcnRfRERERVZJQ0VJREVOVElGSUVSXzJfVG9fMShjb25zdCBERERFVklDRUlERU5USUZJRVIyKiBwSW4sIEREREVWSUNFSURFTlRJRklFUiogcE91dCkKewogICAgLyogMiBhZGRzIGEgZHdXSFFMTGV2ZWwgZmllbGQgdG8gdGhlIGVuZC4gQm90aCBzdHJ1Y3R1cmVzIGFyZQogICAgICogdW52ZXJzaW9uZWQuICovCiAgICBtZW1jcHkocE91dCwgcEluLCBzaXplb2YoKnBPdXQpKTsKfQoKdm9pZCBERFJBV19kdW1wX2Nvb3BlcmF0aXZlbGV2ZWwoRFdPUkQgY29vcGxldmVsKQp7CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzW10gPQogICAgICAgIHsKICAgICAgICAgICAgRkUoRERTQ0xfRlVMTFNDUkVFTiksCiAgICAgICAgICAgIEZFKEREU0NMX0FMTE9XUkVCT09UKSwKICAgICAgICAgICAgRkUoRERTQ0xfTk9XSU5ET1dDSEFOR0VTKSwKICAgICAgICAgICAgRkUoRERTQ0xfTk9STUFMKSwKICAgICAgICAgICAgRkUoRERTQ0xfQUxMT1dNT0RFWCksCiAgICAgICAgICAgIEZFKEREU0NMX0VYQ0xVU0lWRSksCiAgICAgICAgICAgIEZFKEREU0NMX1NFVEZPQ1VTV0lORE9XKSwKICAgICAgICAgICAgRkUoRERTQ0xfU0VUREVWSUNFV0lORE9XKSwKICAgICAgICAgICAgRkUoRERTQ0xfQ1JFQVRFREVWSUNFV0lORE9XKQogICAgfTsKCiAgICBpZiAoVFJBQ0VfT04oZGRyYXcpKQogICAgewogICAgICAgIERQUklOVEYoIiAtICIpOwogICAgICAgIEREUkFXX2R1bXBfZmxhZ3MoY29vcGxldmVsLCBmbGFncywgc2l6ZW9mKGZsYWdzKS9zaXplb2YoZmxhZ3NbMF0pKTsKICAgIH0KfQoKdm9pZCBERFJBV19kdW1wX0REQ0FQUyhjb25zdCBERENBUFMgKmxwY2FwcykKewogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczFbXSA9CiAgICB7CiAgICAgIEZFKEREQ0FQU18zRCksCiAgICAgIEZFKEREQ0FQU19BTElHTkJPVU5EQVJZREVTVCksCiAgICAgIEZFKEREQ0FQU19BTElHTlNJWkVERVNUKSwKICAgICAgRkUoRERDQVBTX0FMSUdOQk9VTkRBUllTUkMpLAogICAgICBGRShERENBUFNfQUxJR05TSVpFU1JDKSwKICAgICAgRkUoRERDQVBTX0FMSUdOU1RSSURFKSwKICAgICAgRkUoRERDQVBTX0JMVCksCiAgICAgIEZFKEREQ0FQU19CTFRRVUVVRSksCiAgICAgIEZFKEREQ0FQU19CTFRGT1VSQ0MpLAogICAgICBGRShERENBUFNfQkxUU1RSRVRDSCksCiAgICAgIEZFKEREQ0FQU19HREkpLAogICAgICBGRShERENBUFNfT1ZFUkxBWSksCiAgICAgIEZFKEREQ0FQU19PVkVSTEFZQ0FOVENMSVApLAogICAgICBGRShERENBUFNfT1ZFUkxBWUZPVVJDQyksCiAgICAgIEZFKEREQ0FQU19PVkVSTEFZU1RSRVRDSCksCiAgICAgIEZFKEREQ0FQU19QQUxFVFRFKSwKICAgICAgRkUoRERDQVBTX1BBTEVUVEVWU1lOQyksCiAgICAgIEZFKEREQ0FQU19SRUFEU0NBTkxJTkUpLAogICAgICBGRShERENBUFNfU1RFUkVPVklFVyksCiAgICAgIEZFKEREQ0FQU19WQkkpLAogICAgICBGRShERENBUFNfWkJMVFMpLAogICAgICBGRShERENBUFNfWk9WRVJMQVlTKSwKICAgICAgRkUoRERDQVBTX0NPTE9SS0VZKSwKICAgICAgRkUoRERDQVBTX0FMUEhBKSwKICAgICAgRkUoRERDQVBTX0NPTE9SS0VZSFdBU1NJU1QpLAogICAgICBGRShERENBUFNfTk9IQVJEV0FSRSksCiAgICAgIEZFKEREQ0FQU19CTFRDT0xPUkZJTEwpLAogICAgICBGRShERENBUFNfQkFOS1NXSVRDSEVEKSwKICAgICAgRkUoRERDQVBTX0JMVERFUFRIRklMTCksCiAgICAgIEZFKEREQ0FQU19DQU5DTElQKSwKICAgICAgRkUoRERDQVBTX0NBTkNMSVBTVFJFVENIRUQpLAogICAgICBGRShERENBUFNfQ0FOQkxUU1lTTUVNKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3MyW10gPQogICAgewogICAgICBGRShERENBUFMyX0NFUlRJRklFRCksCiAgICAgIEZFKEREQ0FQUzJfTk8yRERVUklORzNEU0NFTkUpLAogICAgICBGRShERENBUFMyX1ZJREVPUE9SVCksCiAgICAgIEZFKEREQ0FQUzJfQVVUT0ZMSVBPVkVSTEFZKSwKICAgICAgRkUoRERDQVBTMl9DQU5CT0JJTlRFUkxFQVZFRCksCiAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CTk9OSU5URVJMRUFWRUQpLAogICAgICBGRShERENBUFMyX0NPTE9SQ09OVFJPTE9WRVJMQVkpLAogICAgICBGRShERENBUFMyX0NPTE9SQ09OVFJPTFBSSU1BUlkpLAogICAgICBGRShERENBUFMyX0NBTkRST1BaMTZCSVQpLAogICAgICBGRShERENBUFMyX05PTkxPQ0FMVklETUVNKSwKICAgICAgRkUoRERDQVBTMl9OT05MT0NBTFZJRE1FTUNBUFMpLAogICAgICBGRShERENBUFMyX05PUEFHRUxPQ0tSRVFVSVJFRCksCiAgICAgIEZFKEREQ0FQUzJfV0lERVNVUkZBQ0VTKSwKICAgICAgRkUoRERDQVBTMl9DQU5GTElQT0RERVZFTiksCiAgICAgIEZFKEREQ0FQUzJfQ0FOQk9CSEFSRFdBUkUpLAogICAgICBGRShERENBUFMyX0NPUFlGT1VSQ0MpLAogICAgICBGRShERENBUFMyX1BSSU1BUllHQU1NQSksCiAgICAgIEZFKEREQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQpLAogICAgICBGRShERENBUFMyX0NBTkNBTElCUkFURUdBTU1BKSwKICAgICAgRkUoRERDQVBTMl9GTElQSU5URVJWQUwpLAogICAgICBGRShERENBUFMyX0ZMSVBOT1ZTWU5DKSwKICAgICAgRkUoRERDQVBTMl9DQU5NQU5BR0VURVhUVVJFKSwKICAgICAgRkUoRERDQVBTMl9URVhNQU5JTk5PTkxPQ0FMVklETUVNKSwKICAgICAgRkUoRERDQVBTMl9TVEVSRU8pLAogICAgICBGRShERENBUFMyX1NZU1RPTk9OTE9DQUxfQVNfU1lTVE9MT0NBTCkKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzM1tdID0KICAgIHsKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUQkxUQ0xSU1BBQ0UpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RCTFRDTFJTUEFDRVlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVEJMVFlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfREVTVE9WRVJMQVkpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZQ0xSU1BBQ0UpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX0RFU1RPVkVSTEFZT05FQUNUSVZFKSwKICAgICAgRkUoRERDS0VZQ0FQU19ERVNUT1ZFUkxBWVlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNCTFRDTFJTUEFDRSksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDQkxUQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ0JMVFlVViksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWSksCiAgICAgIEZFKEREQ0tFWUNBUFNfU1JDT1ZFUkxBWUNMUlNQQUNFKSwKICAgICAgRkUoRERDS0VZQ0FQU19TUkNPVkVSTEFZQ0xSU1BBQ0VZVVYpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlPTkVBQ1RJVkUpLAogICAgICBGRShERENLRVlDQVBTX1NSQ09WRVJMQVlZVVYpLAogICAgICBGRShERENLRVlDQVBTX05PQ09TVE9WRVJMQVkpCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczRbXSA9CiAgICB7CiAgICAgIEZFKERERlhDQVBTX0JMVEFMUEhBKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWUFMUEhBKSwKICAgICAgRkUoRERGWENBUFNfQkxUQVJJVEhTVFJFVENIWU4pLAogICAgICBGRShEREZYQ0FQU19CTFRBUklUSFNUUkVUQ0hZKSwKICAgICAgRkUoRERGWENBUFNfQkxUTUlSUk9STEVGVFJJR0hUKSwKICAgICAgRkUoRERGWENBUFNfQkxUTUlSUk9SVVBET1dOKSwKICAgICAgRkUoRERGWENBUFNfQkxUUk9UQVRJT04pLAogICAgICBGRShEREZYQ0FQU19CTFRST1RBVElPTjkwKSwKICAgICAgRkUoRERGWENBUFNfQkxUU0hSSU5LWCksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1hOKSwKICAgICAgRkUoRERGWENBUFNfQkxUU0hSSU5LWSksCiAgICAgIEZFKERERlhDQVBTX0JMVFNIUklOS1lOKSwKICAgICAgRkUoRERGWENBUFNfQkxUU1RSRVRDSFgpLAogICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWE4pLAogICAgICBGRShEREZYQ0FQU19CTFRTVFJFVENIWSksCiAgICAgIEZFKERERlhDQVBTX0JMVFNUUkVUQ0hZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlBUklUSFNUUkVUQ0hZKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWUFSSVRIU1RSRVRDSFlOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWVNIUklOS1gpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWE4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU0hSSU5LWSksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTSFJJTktZTiksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTVFJFVENIWCksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlTVFJFVENIWE4pLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFkpLAogICAgICBGRShEREZYQ0FQU19PVkVSTEFZU1RSRVRDSFlOKSwKICAgICAgRkUoRERGWENBUFNfT1ZFUkxBWU1JUlJPUkxFRlRSSUdIVCksCiAgICAgIEZFKERERlhDQVBTX09WRVJMQVlNSVJST1JVUERPV04pCiAgICB9OwogICAgc3RhdGljIGNvbnN0IGZsYWdfaW5mbyBmbGFnczVbXSA9CiAgICB7CiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFFREdFQkxFTkQpLAogICAgICBGRShEREZYQUxQSEFDQVBTX0JMVEFMUEhBUElYRUxTKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19CTFRBTFBIQVBJWEVMU05FRyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFTVVJGQUNFUyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfQkxUQUxQSEFTVVJGQUNFU05FRyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBRURHRUJMRU5EKSwKICAgICAgRkUoRERGWEFMUEhBQ0FQU19PVkVSTEFZQUxQSEFQSVhFTFMpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQVBJWEVMU05FRyksCiAgICAgIEZFKERERlhBTFBIQUNBUFNfT1ZFUkxBWUFMUEhBU1VSRkFDRVMpLAogICAgICBGRShEREZYQUxQSEFDQVBTX09WRVJMQVlBTFBIQVNVUkZBQ0VTTkVHKQogICAgfTsKICAgIHN0YXRpYyBjb25zdCBmbGFnX2luZm8gZmxhZ3M2W10gPQogICAgewogICAgICBGRShERFBDQVBTXzRCSVQpLAogICAgICBGRShERFBDQVBTXzhCSVRFTlRSSUVTKSwKICAgICAgRkUoRERQQ0FQU184QklUKSwKICAgICAgRkUoRERQQ0FQU19JTklUSUFMSVpFKSwKICAgICAgRkUoRERQQ0FQU19QUklNQVJZU1VSRkFDRSksCiAgICAgIEZFKEREUENBUFNfUFJJTUFSWVNVUkZBQ0VMRUZUKSwKICAgICAgRkUoRERQQ0FQU19BTExPVzI1NiksCiAgICAgIEZFKEREUENBUFNfVlNZTkMpLAogICAgICBGRShERFBDQVBTXzFCSVQpLAogICAgICBGRShERFBDQVBTXzJCSVQpLAogICAgICBGRShERFBDQVBTX0FMUEhBKSwKICAgIH07CiAgICBzdGF0aWMgY29uc3QgZmxhZ19pbmZvIGZsYWdzN1tdID0KICAgIHsKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQxKSwKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQyKSwKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQzKSwKICAgICAgRkUoRERTVkNBUFNfUkVTRVJWRUQ0KSwKICAgICAgRkUoRERTVkNBUFNfU1RFUkVPU0VRVUVOVElBTCksCiAgICB9OwoKICAgIERQUklOVEYoIiAtIGR3U2l6ZSA6ICVsZFxuIiwgbHBjYXBzLT5kd1NpemUpOwogICAgRFBSSU5URigiIC0gZHdDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0NhcHMsIGZsYWdzMSwgc2l6ZW9mKGZsYWdzMSkvc2l6ZW9mKGZsYWdzMVswXSkpOwogICAgRFBSSU5URigiIC0gZHdDYXBzMiA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdDYXBzMiwgZmxhZ3MyLCBzaXplb2YoZmxhZ3MyKS9zaXplb2YoZmxhZ3MyWzBdKSk7CiAgICBEUFJJTlRGKCIgLSBkd0NLZXlDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0NLZXlDYXBzLCBmbGFnczMsIHNpemVvZihmbGFnczMpL3NpemVvZihmbGFnczNbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3RlhDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0ZYQ2FwcywgZmxhZ3M0LCBzaXplb2YoZmxhZ3M0KS9zaXplb2YoZmxhZ3M0WzBdKSk7CiAgICBEUFJJTlRGKCIgLSBkd0ZYQWxwaGFDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd0ZYQWxwaGFDYXBzLCBmbGFnczUsIHNpemVvZihmbGFnczUpL3NpemVvZihmbGFnczVbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3UGFsQ2FwcyA6ICIpOyBERFJBV19kdW1wX2ZsYWdzKGxwY2Fwcy0+ZHdQYWxDYXBzLCBmbGFnczYsIHNpemVvZihmbGFnczYpL3NpemVvZihmbGFnczZbMF0pKTsKICAgIERQUklOVEYoIiAtIGR3U1ZDYXBzIDogIik7IEREUkFXX2R1bXBfZmxhZ3MobHBjYXBzLT5kd1NWQ2FwcywgZmxhZ3M3LCBzaXplb2YoZmxhZ3M3KS9zaXplb2YoZmxhZ3M3WzBdKSk7CiAgICBEUFJJTlRGKCIuLi5cbiIpOwogICAgRFBSSU5URigiIC0gZHdOdW1Gb3VyQ0NDb2RlcyA6ICVsZFxuIiwgbHBjYXBzLT5kd051bUZvdXJDQ0NvZGVzKTsKICAgIERQUklOVEYoIiAtIGR3Q3VyclZpc2libGVPdmVybGF5cyA6ICVsZFxuIiwgbHBjYXBzLT5kd0N1cnJWaXNpYmxlT3ZlcmxheXMpOwogICAgRFBSSU5URigiIC0gZHdNaW5PdmVybGF5U3RyZXRjaCA6ICVsZFxuIiwgbHBjYXBzLT5kd01pbk92ZXJsYXlTdHJldGNoKTsKICAgIERQUklOVEYoIiAtIGR3TWF4T3ZlcmxheVN0cmV0Y2ggOiAlbGRcbiIsIGxwY2Fwcy0+ZHdNYXhPdmVybGF5U3RyZXRjaCk7CiAgICBEUFJJTlRGKCIuLi5cbiIpOwogICAgRFBSSU5URigiIC0gZGRzQ2FwcyA6ICIpOyBERFJBV19kdW1wX0REU0NBUFMyKCZscGNhcHMtPmRkc0NhcHMpOyBEUFJJTlRGKCJcbiIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXVsdGlwbHlfbWF0cml4CiAqCiAqIE11bHRpcGxpZXMgMiA0eDQgbWF0cmljZXMgc3JjMSBhbmQgc3JjMiwgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGRlc3QuCiAqCiAqIFBhcmFtczoKICogIGRlc3Q6IFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG1hdHJpeAogKiAgc3JjMTogUG9pbnRlciB0byB0aGUgZmlyc3Qgc291cmNlIG1hdHJpeAogKiAgc3JjMjogUG9pbnRlciB0byB0aGUgc2Vjb25kIHNvdXJjZSBtYXRyaXgKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCm11bHRpcGx5X21hdHJpeChEM0RNQVRSSVggKmRlc3QsCiAgICAgICAgICAgICAgICBEM0RNQVRSSVggKnNyYzEsCiAgICAgICAgICAgICAgICBEM0RNQVRSSVggKnNyYzIpCnsKICAgIEQzRE1BVFJJWCB0ZW1wOwoKICAgIC8qIE5vdyBkbyB0aGUgbXVsdGlwbGljYXRpb24gJ2J5IGhhbmQnLgogICAgICAgSSBrbm93IHRoYXQgYWxsIHRoaXMgY291bGQgYmUgb3B0aW1pc2VkLCBidXQgdGhpcyB3aWxsIGJlIGRvbmUgbGF0ZXIgOi0pICovCiAgICB0ZW1wLl8xMSA9IChzcmMxLT5fMTEgKiBzcmMyLT5fMTEpICsgKHNyYzEtPl8yMSAqIHNyYzItPl8xMikgKyAoc3JjMS0+XzMxICogc3JjMi0+XzEzKSArIChzcmMxLT5fNDEgKiBzcmMyLT5fMTQpOwogICAgdGVtcC5fMjEgPSAoc3JjMS0+XzExICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjEgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zMSAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQxICogc3JjMi0+XzI0KTsKICAgIHRlbXAuXzMxID0gKHNyYzEtPl8xMSAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzIxICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzEgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80MSAqIHNyYzItPl8zNCk7CiAgICB0ZW1wLl80MSA9IChzcmMxLT5fMTEgKiBzcmMyLT5fNDEpICsgKHNyYzEtPl8yMSAqIHNyYzItPl80MikgKyAoc3JjMS0+XzMxICogc3JjMi0+XzQzKSArIChzcmMxLT5fNDEgKiBzcmMyLT5fNDQpOwoKICAgIHRlbXAuXzEyID0gKHNyYzEtPl8xMiAqIHNyYzItPl8xMSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzEyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fMTMpICsgKHNyYzEtPl80MiAqIHNyYzItPl8xNCk7CiAgICB0ZW1wLl8yMiA9IChzcmMxLT5fMTIgKiBzcmMyLT5fMjEpICsgKHNyYzEtPl8yMiAqIHNyYzItPl8yMikgKyAoc3JjMS0+XzMyICogc3JjMi0+XzIzKSArIChzcmMxLT5fNDIgKiBzcmMyLT5fMjQpOwogICAgdGVtcC5fMzIgPSAoc3JjMS0+XzEyICogc3JjMi0+XzMxKSArIChzcmMxLT5fMjIgKiBzcmMyLT5fMzIpICsgKHNyYzEtPl8zMiAqIHNyYzItPl8zMykgKyAoc3JjMS0+XzQyICogc3JjMi0+XzM0KTsKICAgIHRlbXAuXzQyID0gKHNyYzEtPl8xMiAqIHNyYzItPl80MSkgKyAoc3JjMS0+XzIyICogc3JjMi0+XzQyKSArIChzcmMxLT5fMzIgKiBzcmMyLT5fNDMpICsgKHNyYzEtPl80MiAqIHNyYzItPl80NCk7CgogICAgdGVtcC5fMTMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzExKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fMTIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl8xMykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzE0KTsKICAgIHRlbXAuXzIzID0gKHNyYzEtPl8xMyAqIHNyYzItPl8yMSkgKyAoc3JjMS0+XzIzICogc3JjMi0+XzIyKSArIChzcmMxLT5fMzMgKiBzcmMyLT5fMjMpICsgKHNyYzEtPl80MyAqIHNyYzItPl8yNCk7CiAgICB0ZW1wLl8zMyA9IChzcmMxLT5fMTMgKiBzcmMyLT5fMzEpICsgKHNyYzEtPl8yMyAqIHNyYzItPl8zMikgKyAoc3JjMS0+XzMzICogc3JjMi0+XzMzKSArIChzcmMxLT5fNDMgKiBzcmMyLT5fMzQpOwogICAgdGVtcC5fNDMgPSAoc3JjMS0+XzEzICogc3JjMi0+XzQxKSArIChzcmMxLT5fMjMgKiBzcmMyLT5fNDIpICsgKHNyYzEtPl8zMyAqIHNyYzItPl80MykgKyAoc3JjMS0+XzQzICogc3JjMi0+XzQ0KTsKCiAgICB0ZW1wLl8xNCA9IChzcmMxLT5fMTQgKiBzcmMyLT5fMTEpICsgKHNyYzEtPl8yNCAqIHNyYzItPl8xMikgKyAoc3JjMS0+XzM0ICogc3JjMi0+XzEzKSArIChzcmMxLT5fNDQgKiBzcmMyLT5fMTQpOwogICAgdGVtcC5fMjQgPSAoc3JjMS0+XzE0ICogc3JjMi0+XzIxKSArIChzcmMxLT5fMjQgKiBzcmMyLT5fMjIpICsgKHNyYzEtPl8zNCAqIHNyYzItPl8yMykgKyAoc3JjMS0+XzQ0ICogc3JjMi0+XzI0KTsKICAgIHRlbXAuXzM0ID0gKHNyYzEtPl8xNCAqIHNyYzItPl8zMSkgKyAoc3JjMS0+XzI0ICogc3JjMi0+XzMyKSArIChzcmMxLT5fMzQgKiBzcmMyLT5fMzMpICsgKHNyYzEtPl80NCAqIHNyYzItPl8zNCk7CiAgICB0ZW1wLl80NCA9IChzcmMxLT5fMTQgKiBzcmMyLT5fNDEpICsgKHNyYzEtPl8yNCAqIHNyYzItPl80MikgKyAoc3JjMS0+XzM0ICogc3JjMi0+XzQzKSArIChzcmMxLT5fNDQgKiBzcmMyLT5fNDQpOwoKICAgIC8qIEFuZCBjb3B5IHRoZSBuZXcgbWF0cml4IGluIHRoZSBnb29kIHN0b3JhZ2UuLiAqLwogICAgbWVtY3B5KGRlc3QsICZ0ZW1wLCAxNiAqIHNpemVvZihEM0RWQUxVRSkpOwp9CgoKSFJFU1VMVApocl9kZHJhd19mcm9tX3dpbmVkM2QoSFJFU1VMVCBocikKewogICAgc3dpdGNoKGhyKQogICAgewogICAgICAgIGNhc2UgV0lORUQzREVSUl9JTlZBTElEQ0FMTDogcmV0dXJuIERERVJSX0lOVkFMSURQQVJBTVM7CiAgICAgICAgZGVmYXVsdDogcmV0dXJuIGhyOwogICAgfQp9Cg==