LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiBzY2FwaS5jCiAqCiAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZmRlZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CgojaWZkZWYgTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L21kNS5oPgojZW5kaWYKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvY2FsbGJhY2suaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9zZWNtb2QuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcHVzbS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9rZXl0b29scy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zY2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9taWIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvdHJhbnNmb3JtX29pZHMuaD4KCiNpZmRlZiBORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvb3BlbnNzbF9tZDUuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvb3BlbnNzbF9zaGEuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvb3BlbnNzbF9kZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvb3BlbnNzbF9hZXMuaD4KI2VuZGlmCiNpZmRlZiBORVRTTk1QX1VTRV9PUEVOU1NMCiNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CiNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CiNpZmRlZiBIQVZFX0FFUwojaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KI2VuZGlmCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKI2lmZGVmIEhBVkVfU1RSVUNUX0RFU19LU19TVFJVQ1RfV0VBS19LRVkKLyogdGhlc2UgYXJlIG9sZGVyIG5hbWVzIGZvciBuZXdlciBzdHJ1Y3R1cmVzIHRoYXQgZXhpc3QgaW4gb3BlbnNzbCAuOS43ICovCiNkZWZpbmUgREVTX2tleV9zY2hlZHVsZSAgICBkZXNfa2V5X3NjaGVkdWxlIAojZGVmaW5lIERFU19jYmxvY2sgICAgICAgICAgZGVzX2NibG9jayAKI2RlZmluZSBERVNfa2V5X3NjaGVkICAgICAgIGRlc19rZXlfc2NoZWQgCiNkZWZpbmUgREVTX25jYmNfZW5jcnlwdCAgICBkZXNfbmNiY19lbmNyeXB0CiNkZWZpbmUgREVTX2NiY19lbmNyeXB0ICAgIGRlc19jYmNfZW5jcnlwdAojZGVmaW5lIE9MRF9ERVMKI2VuZGlmCiNlbmRpZgoKI2VuZGlmIC8qIEhBVkVfT1BFTlNTTCAqLwoKI2lmZGVmIE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTwojZW5kaWYKCiNpZmRlZiBORVRTTk1QX1VTRV9QS0NTMTEKI2luY2x1ZGUgPHNlY3VyaXR5L2NyeXB0b2tpLmg+CiNlbmRpZgoKI2lmZGVmIFFVSVRGVU4KI3VuZGVmIFFVSVRGVU4KI2RlZmluZSBRVUlURlVOKGUsIGwpCQkJCQlcCglpZiAoZSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsJCQlcCgkJcnZhbCA9IFNOTVBFUlJfU0NfR0VORVJBTF9GQUlMVVJFOwlcCgkJZ290byBsIDsJCQkJXAoJfQojZW5kaWYKCiNpZmRlZiBORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8Kc3RhdGljCmludCBTSEExX2htYWMoY29uc3QgdV9jaGFyICogZGF0YSwgc2l6ZV90IGxlbiwgdV9jaGFyICogbWFjLCBzaXplX3QgbWFjbGVuLAogICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIHNlY3JldCwgc2l6ZV90IHNlY3JldGxlbik7CgpzdGF0aWMKaW50IE1ENV9obWFjKGNvbnN0IHVfY2hhciAqIGRhdGEsIHNpemVfdCBsZW4sIHVfY2hhciAqIG1hYywgc2l6ZV90IG1hY2xlbiwKICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIHNlY3JldCwgc2l6ZV90IHNlY3JldGxlbik7CiNlbmRpZgoKLyoKICogc2NfZ2V0X3Byb3Blcmxlbmd0aChvaWQgKmhhc2h0eXBlLCB1X2ludCBoYXNodHlwZV9sZW4pOgogKiAKICogR2l2ZW4gYSBoYXNoaW5nIHR5cGUgKCJoYXNodHlwZSIgYW5kIGl0cyBsZW5ndGggaGFzaHR5cGVfbGVuKSwgcmV0dXJuCiAqIHRoZSBsZW5ndGggb2YgdGhlIGhhc2ggcmVzdWx0LgogKiAKICogUmV0dXJucyBlaXRoZXIgdGhlIGxlbmd0aCBvciBTTk1QRVJSX0dFTkVSUiBmb3IgYW4gdW5rbm93biBoYXNoaW5nIHR5cGUuCiAqLwppbnQKc2NfZ2V0X3Byb3Blcmxlbmd0aChjb25zdCBvaWQgKiBoYXNodHlwZSwgdV9pbnQgaGFzaHR5cGVfbGVuKQp7CiAgICBERUJVR1RSQUNFOwogICAgLyoKICAgICAqIERldGVybWluZSB0cmFuc2Zvcm0gdHlwZSBoYXNoIGxlbmd0aC4KICAgICAqLwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIGlmIChJU1RSQU5TRk9STShoYXNodHlwZSwgSE1BQ01ENUF1dGgpKSB7CiAgICAgICAgcmV0dXJuIEJZVEVTSVpFKFNOTVBfVFJBTlNfQVVUSExFTl9ITUFDTUQ1KTsKICAgIH0gZWxzZQojZW5kaWYKICAgICAgICBpZiAoSVNUUkFOU0ZPUk0oaGFzaHR5cGUsIEhNQUNTSEExQXV0aCkpIHsKICAgICAgICByZXR1cm4gQllURVNJWkUoU05NUF9UUkFOU19BVVRITEVOX0hNQUNTSEExKTsKICAgIH0KICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKfQoKaW50CnNjX2dldF9wcm9wZXJfcHJpdl9sZW5ndGgoY29uc3Qgb2lkICogcHJpdnR5cGUsIHVfaW50IHByaXZ0eXBlX2xlbikKewogICAgaW50IHByb3Blcmxlbmd0aCA9IDA7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBERVNQcml2KSkgewogICAgICAgIHByb3Blcmxlbmd0aCA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl8xREVTKTsKICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBBRVNQcml2KSkgewogICAgICAgIHByb3Blcmxlbmd0aCA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl9BRVMpOwogICAgfQojZW5kaWYKICAgIHJldHVybiBwcm9wZXJsZW5ndGg7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBzY19pbml0CiAqCiAqIFJldHVybnM6CiAqCVNOTVBFUlJfU1VDQ0VTUwkJCVN1Y2Nlc3MuCiAqLwppbnQKc2NfaW5pdCh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKCiNpZiAhZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKQojaWYgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPKQogICAgc3RydWN0IHRpbWV2YWwgIHR2OwoKICAgIERFQlVHVFJBQ0U7CgogICAgZ2V0dGltZW9mZGF5KCZ0diwgKHN0cnVjdCB0aW1lem9uZSAqKSAwKTsKCiAgICBzcmFuZG9tKHR2LnR2X3NlYyBeIHR2LnR2X3VzZWMpOwojZWxpZiBORVRTTk1QX1VTRV9QS0NTMTEKICAgIERFQlVHVFJBQ0U7CiAgICBydmFsID0gcGtjc19pbml0KCk7CiNlbHNlCiAgICBydmFsID0gU05NUEVSUl9TQ19OT1RfQ09ORklHVVJFRDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1ICovCiAgICAvKgogICAgICogWFhYIG9ndWQ6IFRoZSBvbmx5IHJlYXNvbiB0byBkbyBhbnl0aGluZyBoZXJlIHdpdGggb3BlbnNzbCBpcyB0byAKICAgICAqICogWFhYIG9ndWQ6IHNlZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgCiAgICAgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZm5kZWYgTkVUU05NUF9VU0VfT1BFTlNTTCAqLwogICAgcmV0dXJuIHJ2YWw7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNjX2luaXQoKSAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogc2NfcmFuZG9tCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSpidWYJCVByZS1hbGxvY2F0ZWQgYnVmZmVyLgogKgkqYnVmbGVuIAlTaXplIG9mIGJ1ZmZlci4KICogICAgICAKICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQkJU3VjY2Vzcy4KICovCmludApzY19yYW5kb20odV9jaGFyICogYnVmLCBzaXplX3QgKiBidWZsZW4pCiNpZiBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX1BLQ1MxMSkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8pCnsKICAgIGludCAgICAgICAgICAgICBydmFsID0gU05NUEVSUl9TVUNDRVNTOwojaWYgIWRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgJiYgIWRlZmluZWQoTkVUU05NUF9VU0VfUEtDUzExKQogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBpbnQgICAgICAgICAgICAgcm5kdmFsOwogICAgdV9jaGFyICAgICAgICAgKnVjcCA9IGJ1ZjsKI2VuZGlmCgogICAgREVCVUdUUkFDRTsKCiNpZmRlZiBORVRTTk1QX1VTRV9PUEVOU1NMCiAgICBSQU5EX2J5dGVzKGJ1ZiwgKmJ1Zmxlbik7ICAgLyogd2lsbCBuZXZlciBmYWlsICovCiNlbGlmIE5FVFNOTVBfVVNFX1BLQ1MxMQkJCS8qIE5FVFNOTVBfVVNFX1BLQ1MxMSAqLwogICAgcGtjc19yYW5kb20oYnVmLCAqYnVmbGVuKTsKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUgKi8KICAgIC8qCiAgICAgKiBmaWxsIHRoZSBidWZmZXIgd2l0aCByYW5kb20gaW50ZWdlcnMuICBOb3RlIHRoYXQgcmFuZG9tKCkKICAgICAqIGlzIGRlZmluZWQgaW4gY29uZmlnLmggYW5kIG1heSBub3QgYmUgdHJ1bHkgdGhlIHJhbmRvbSgpCiAgICAgKiBzeXN0ZW0gY2FsbCBpZiBzb21ldGhpbmcgYmV0dGVyIGV4aXN0ZWQgCiAgICAgKi8KICAgIHJ2YWwgPSAqYnVmbGVuIC0gKmJ1ZmxlbiAlIHNpemVvZihybmR2YWwpOwogICAgZm9yIChpID0gMDsgaSA8IHJ2YWw7IGkgKz0gc2l6ZW9mKHJuZHZhbCkpIHsKICAgICAgICBybmR2YWwgPSByYW5kb20oKTsKICAgICAgICBtZW1jcHkodWNwLCAmcm5kdmFsLCBzaXplb2Yocm5kdmFsKSk7CiAgICAgICAgdWNwICs9IHNpemVvZihybmR2YWwpOwogICAgfQoKICAgIHJuZHZhbCA9IHJhbmRvbSgpOwogICAgbWVtY3B5KHVjcCwgJnJuZHZhbCwgKmJ1ZmxlbiAlIHNpemVvZihybmR2YWwpKTsKCiAgICBydmFsID0gU05NUEVSUl9TVUNDRVNTOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX09QRU5TU0wgKi8KICAgIHJldHVybiBydmFsOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgc2NfcmFuZG9tKCkgKi8KCiNlbHNlCl9TQ0FQSV9OT1RfQ09ORklHVVJFRAojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBzY19nZW5lcmF0ZV9rZXllZF9oYXNoCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBhdXRodHlwZQlUeXBlIG9mIGF1dGhlbnRpY2F0aW9uIHRyYW5zZm9ybS4KICoJIGF1dGh0eXBlbGVuCiAqCSprZXkJCVBvaW50ZXIgdG8ga2V5IChLdWwpIHRvIHVzZSBpbiBrZXllZCBoYXNoLgogKgkga2V5bGVuCQlMZW5ndGggb2Yga2V5IGluIGJ5dGVzLgogKgkqbWVzc2FnZQlQb2ludGVyIHRvIHRoZSBtZXNzYWdlIHRvIGhhc2guCiAqCSBtc2dsZW4JCUxlbmd0aCBvZiB0aGUgbWVzc2FnZS4KICoJKk1BQwkJV2lsbCBiZSByZXR1cm5lZCB3aXRoIGFsbG9jYXRlZCBieXRlcyBjb250YWluZyBoYXNoLgogKgkqbWFjbGVuCQlMZW5ndGggb2YgdGhlIGhhc2ggYnVmZmVyIGluIGJ5dGVzOyBhbHNvIGluZGljYXRlcwogKgkJCQl3aGV0aGVyIHRoZSBNQUMgc2hvdWxkIGJlIHRydW5jYXRlZC4KICogICAgICAKICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQkJU3VjY2Vzcy4KICoJU05NUEVSUl9HRU5FUlIJCQlBbGwgZXJycwogKgogKgogKiBBIGhhc2ggb2YgdGhlIGZpcnN0IG1zZ2xlbiBieXRlcyBvZiBtZXNzYWdlIHVzaW5nIGEga2V5ZWQgaGFzaCBkZWZpbmVkCiAqIGJ5IGF1dGh0eXBlIGlzIGNyZWF0ZWQgYW5kIHN0b3JlZCBpbiBNQUMuICBNQUMgaXMgQVNTVU1FRCB0byBiZSBhIGJ1ZmZlcgogKiBvZiBhdCBsZWFzdCBtYWNsZW4gYnl0ZXMuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBoYXNoIGlzIGdyZWF0ZXIgdGhhbgogKiBtYWNsZW4sIGl0IGlzIHRydW5jYXRlZCB0byBmaXQgdGhlIGJ1ZmZlci4gIElmIHRoZSBsZW5ndGggb2YgdGhlIGhhc2ggaXMKICogbGVzcyB0aGFuIG1hY2xlbiwgbWFjbGVuIHNldCB0byB0aGUgbnVtYmVyIG9mIGhhc2ggYnl0ZXMgZ2VuZXJhdGVkLgogKgogKiBBU1NVTUVEIHRoYXQgdGhlIG51bWJlciBvZiBoYXNoIGJpdHMgaXMgYSBtdWx0aXBsZSBvZiA4LgogKi8KaW50CnNjX2dlbmVyYXRlX2tleWVkX2hhc2goY29uc3Qgb2lkICogYXV0aHR5cGUsIHNpemVfdCBhdXRodHlwZWxlbiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBrZXksIHVfaW50IGtleWxlbiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBtZXNzYWdlLCB1X2ludCBtc2dsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogTUFDLCBzaXplX3QgKiBtYWNsZW4pCiNpZiAgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9QS0NTMTEpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPKQp7CiAgICBpbnQgICAgICAgICAgICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKICAgIGludCAgICAgICAgICAgICBpcHJvcGVybGVuZ3RoOwogICAgc2l6ZV90ICAgICAgICAgIHByb3Blcmxlbmd0aDsKCiAgICB1X2NoYXIgICAgICAgICAgYnVmW1NOTVBfTUFYQlVGX1NNQUxMXTsKI2lmICBkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfUEtDUzExKQogICAgdW5zaWduZWQgaW50ICAgIGJ1Zl9sZW4gPSBzaXplb2YoYnVmKTsKI2VuZGlmCgogICAgREVCVUdUUkFDRTsKCiNpZmRlZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgIHsKICAgICAgICBpbnQgICAgICAgICAgICAgaTsKICAgICAgICBERUJVR01TRygoInNjX2dlbmVyYXRlX2tleWVkX2hhc2giLAogICAgICAgICAgICAgICAgICAic2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaCgpOiBrZXk9MHgiKSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleWxlbjsgaSsrKQogICAgICAgICAgICBERUJVR01TRygoInNjX2dlbmVyYXRlX2tleWVkX2hhc2giLCAiJTAyeCIsIGtleVtpXSAmIDB4ZmYpKTsKICAgICAgICBERUJVR01TRygoInNjX2dlbmVyYXRlX2tleWVkX2hhc2giLCAiICglZClcbiIsIGtleWxlbikpOwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERSAqLwoKICAgIC8qCiAgICAgKiBTYW5pdHkgY2hlY2suCiAgICAgKi8KICAgIGlmICghYXV0aHR5cGUgfHwgIWtleSB8fCAhbWVzc2FnZSB8fCAhTUFDIHx8ICFtYWNsZW4KICAgICAgICB8fCAoa2V5bGVuIDw9IDApIHx8IChtc2dsZW4gPD0gMCkgfHwgKCptYWNsZW4gPD0gMCkKICAgICAgICB8fCAoYXV0aHR5cGVsZW4gIT0gVVNNX0xFTkdUSF9PSURfVFJBTlNGT1JNKSkgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdCk7CiAgICB9CgogICAgaXByb3Blcmxlbmd0aCA9IHNjX2dldF9wcm9wZXJsZW5ndGgoYXV0aHR5cGUsIGF1dGh0eXBlbGVuKTsKICAgIGlmIChpcHJvcGVybGVuZ3RoID09IFNOTVBFUlJfR0VORVJSKQogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIHByb3Blcmxlbmd0aCA9IChzaXplX3QpaXByb3Blcmxlbmd0aDsKICAgIGlmIChrZXlsZW4gPCBwcm9wZXJsZW5ndGgpIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoX3F1aXQpOwogICAgfQojaWZkZWYgTkVUU05NUF9VU0VfT1BFTlNTTAogICAgLyoKICAgICAqIERldGVybWluZSB0cmFuc2Zvcm0gdHlwZS4KICAgICAqLwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIGlmIChJU1RSQU5TRk9STShhdXRodHlwZSwgSE1BQ01ENUF1dGgpKQogICAgICAgIEhNQUMoRVZQX21kNSgpLCBrZXksIGtleWxlbiwgbWVzc2FnZSwgbXNnbGVuLCBidWYsICZidWZfbGVuKTsKICAgIGVsc2UKI2VuZGlmCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKGF1dGh0eXBlLCBITUFDU0hBMUF1dGgpKQogICAgICAgIEhNQUMoRVZQX3NoYTEoKSwga2V5LCBrZXlsZW4sIG1lc3NhZ2UsIG1zZ2xlbiwgYnVmLCAmYnVmX2xlbik7CiAgICBlbHNlIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoX3F1aXQpOwogICAgfQogICAgaWYgKGJ1Zl9sZW4gIT0gcHJvcGVybGVuZ3RoKSB7CiAgICAgICAgUVVJVEZVTihydmFsLCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoX3F1aXQpOwogICAgfQogICAgaWYgKCptYWNsZW4gPiBidWZfbGVuKQogICAgICAgICptYWNsZW4gPSBidWZfbGVuOwogICAgbWVtY3B5KE1BQywgYnVmLCAqbWFjbGVuKTsKCiNlbGlmIE5FVFNOTVBfVVNFX1BLQ1MxMSAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfUEtDUzExICovCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIGlmIChJU1RSQU5TRk9STShhdXRodHlwZSwgSE1BQ01ENUF1dGgpKSB7CglpZiAocGtjc19zaWduKENLTV9NRDVfSE1BQyxrZXksIGtleWxlbiwgbWVzc2FnZSwKCQkJbXNnbGVuLCBidWYsICZidWZfbGVuKSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0KTsKICAgICAgICB9CiAgICB9IGVsc2UKI2VuZGlmCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKGF1dGh0eXBlLCBITUFDU0hBMUF1dGgpKSB7CglpZiAocGtjc19zaWduKENLTV9TSEFfMV9ITUFDLGtleSwga2V5bGVuLCBtZXNzYWdlLAoJCQltc2dsZW4sIGJ1ZiwgJmJ1Zl9sZW4pICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoX3F1aXQpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0KTsKICAgIH0KCiAgICBpZiAoYnVmX2xlbiAhPSBwcm9wZXJsZW5ndGgpIHsKICAgICAgICBRVUlURlVOKHJ2YWwsIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdCk7CiAgICB9CiAgICBpZiAoKm1hY2xlbiA+IGJ1Zl9sZW4pCiAgICAgICAgKm1hY2xlbiA9IGJ1Zl9sZW47CiAgICBtZW1jcHkoTUFDLCBidWYsICptYWNsZW4pOwoKI2VsaWYgTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPCiAgICBpZiAoKm1hY2xlbiA+IHByb3Blcmxlbmd0aCkKICAgICAgICAqbWFjbGVuID0gcHJvcGVybGVuZ3RoOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIGlmIChJU1RSQU5TRk9STShhdXRodHlwZSwgSE1BQ01ENUF1dGgpKQogICAgICAgIHJ2YWwgPSBNRDVfaG1hYyhtZXNzYWdlLCBtc2dsZW4sIE1BQywgKm1hY2xlbiwga2V5LCBrZXlsZW4pOwogICAgZWxzZQojZW5kaWYKICAgICAgICAgaWYgKElTVFJBTlNGT1JNKGF1dGh0eXBlLCBITUFDU0hBMUF1dGgpKQogICAgICAgIHJ2YWwgPSBTSEExX2htYWMobWVzc2FnZSwgbXNnbGVuLCBNQUMsICptYWNsZW4sIGtleSwga2V5bGVuKTsKICAgIGVsc2UgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdCk7CiAgICB9CiAgICBpZiAocnZhbCAhPSAwKSB7CiAgICAgICAgcnZhbCA9IFNOTVBFUlJfR0VORVJSOwogICAgICAgIGdvdG8gc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0OwogICAgfSAgICAKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1ICovCiAgICBpZiAoKm1hY2xlbiA+IHByb3Blcmxlbmd0aCkKICAgICAgICAqbWFjbGVuID0gcHJvcGVybGVuZ3RoOwogICAgaWYgKE1Ec2lnbihtZXNzYWdlLCBtc2dsZW4sIE1BQywgKm1hY2xlbiwga2V5LCBrZXlsZW4pKSB7CiAgICAgICAgcnZhbCA9IFNOTVBFUlJfR0VORVJSOwogICAgICAgIGdvdG8gc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0OwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX09QRU5TU0wgKi8KCiNpZmRlZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgIHsKICAgICAgICBjaGFyICAgICAgICAgICAqczsKICAgICAgICBpbnQgICAgICAgICAgICAgbGVuID0gYmluYXJ5X3RvX2hleChNQUMsICptYWNsZW4sICZzKTsKCiAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgIkZ1bGwgdjMgbWVzc2FnZSBoYXNoOiAlc1xuIiwgcykpOwogICAgICAgIFNOTVBfWkVSTyhzLCBsZW4pOwogICAgICAgIFNOTVBfRlJFRShzKTsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCiAgc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0OgogICAgbWVtc2V0KGJ1ZiwgMCwgU05NUF9NQVhCVUZfU01BTEwpOwogICAgcmV0dXJuIHJ2YWw7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNjX2dlbmVyYXRlX2tleWVkX2hhc2goKSAqLwoKI2Vsc2UKICAgICAgICAgICAgICAgIF9TQ0FQSV9OT1RfQ09ORklHVVJFRAojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICovCi8qCiAqIHNjX2hhc2goKTogYSBnZW5lcmljIHdyYXBwZXIgYXJvdW5kIHdoYXRldmVyIGhhc2hpbmcgcGFja2FnZSB3ZSBhcmUgdXNpbmcuCiAqIAogKiBJTjoKICogaGFzaHR5cGUgICAgLSBvaWQgcG9pbnRlciB0byBhIGhhc2ggdHlwZQogKiBoYXNodHlwZWxlbiAtIGxlbmd0aCBvZiBvaWQgcG9pbnRlcgogKiBidWYgICAgICAgICAtIHVfY2hhciBidWZmZXIgdG8gYmUgaGFzaGVkCiAqIGJ1Zl9sZW4gICAgIC0gaW50ZWdlciBsZW5ndGggb2YgYnVmIGRhdGEKICogTUFDX2xlbiAgICAgLSBsZW5ndGggb2YgdGhlIHBhc3NlZCBNQUMgYnVmZmVyIHNpemUuCiAqIAogKiBPVVQ6ICAgIAogKiBNQUMgICAgICAgICAtIHByZS1tYWxsb2NlZCBzcGFjZSB0byBzdG9yZSBoYXNoIG91dHB1dC4KICogTUFDX2xlbiAgICAgLSBsZW5ndGggb2YgTUFDIG91dHB1dCB0byB0aGUgTUFDIGJ1ZmZlci4KICogCiAqIFJldHVybnM6CiAqIFNOTVBFUlJfU1VDQ0VTUyAgICAgICAgICAgICAgU3VjY2Vzcy4KICogU05NUF9TQ19HRU5FUkFMX0ZBSUxVUkUgICAgICBBbnkgZXJyb3IuCiAqIFNOTVBFUlJfU0NfTk9UX0NPTkZJR1VSRUQgICAgSGFzaCB0eXBlIG5vdCBzdXBwb3J0ZWQuCiAqLwppbnQKc2NfaGFzaChjb25zdCBvaWQgKiBoYXNodHlwZSwgc2l6ZV90IGhhc2h0eXBlbGVuLCBjb25zdCB1X2NoYXIgKiBidWYsCiAgICAgICAgc2l6ZV90IGJ1Zl9sZW4sIHVfY2hhciAqIE1BQywgc2l6ZV90ICogTUFDX2xlbikKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1KSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfUEtDUzExKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTykKewojaWYgZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX1BLQ1MxMSkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8pCiAgICBpbnQgICAgICAgICAgICBydmFsID0gU05NUEVSUl9TVUNDRVNTOwojZW5kaWYKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9QS0NTMTEpCiAgICB1bnNpZ25lZCBpbnQgICB0bXBfbGVuOwojZW5kaWYKICAgIGludCAgICAgICAgICAgIHJldDsKCiNpZmRlZiBORVRTTk1QX1VTRV9PUEVOU1NMCiAgICBjb25zdCBFVlBfTUQgICAqaGFzaGZuOwogICAgRVZQX01EX0NUWCAgICAgKmNwdHI7CiNlbmRpZgojaWZkZWYgTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPCiAgICBNRDVfQ1RYICAgICAgICBjbWQ1OwogICAgU0hBX0NUWCAgICAgICAgY3NoYTE7CiNlbmRpZgogICAgREVCVUdUUkFDRTsKCiAgICBpZiAoaGFzaHR5cGUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBidWZfbGVuIDw9IDAgfHwKICAgICAgICBNQUMgPT0gTlVMTCB8fCBNQUNfbGVuID09IE5VTEwgKQogICAgICAgIHJldHVybiAoU05NUEVSUl9HRU5FUlIpOwogICAgcmV0ID0gc2NfZ2V0X3Byb3Blcmxlbmd0aChoYXNodHlwZSwgaGFzaHR5cGVsZW4pOwogICAgaWYgKCggcmV0IDwgMCApIHx8ICgqTUFDX2xlbiA8IChzaXplX3QpcmV0ICkpCiAgICAgICAgcmV0dXJuIChTTk1QRVJSX0dFTkVSUik7CgojaWZkZWYgTkVUU05NUF9VU0VfT1BFTlNTTAogICAgLyoKICAgICAqIERldGVybWluZSB0cmFuc2Zvcm0gdHlwZS4KICAgICAqLwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIGlmIChJU1RSQU5TRk9STShoYXNodHlwZSwgSE1BQ01ENUF1dGgpKSB7CiAgICAgICAgaGFzaGZuID0gKGNvbnN0IEVWUF9NRCAqKSBFVlBfbWQ1KCk7CiAgICB9IGVsc2UKI2VuZGlmCiAgICAgICAgaWYgKElTVFJBTlNGT1JNKGhhc2h0eXBlLCBITUFDU0hBMUF1dGgpKSB7CiAgICAgICAgaGFzaGZuID0gKGNvbnN0IEVWUF9NRCAqKSBFVlBfc2hhMSgpOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gKFNOTVBFUlJfR0VORVJSKTsKICAgIH0KCi8qKiBpbml0aWFsaXplIHRoZSBwb2ludGVyICovCiNpZmRlZiBIQVZFX0VWUF9NRF9DVFhfQ1JFQVRFCiAgICBjcHRyID0gRVZQX01EX0NUWF9jcmVhdGUoKTsKI2Vsc2UKICAgIGNwdHIgPSBtYWxsb2Moc2l6ZW9mKCpjcHRyKSk7CiNpZiBkZWZpbmVkKE9MRF9ERVMpCiAgICBtZW1zZXQoY3B0ciwgMCwgc2l6ZW9mKCpjcHRyKSk7CiNlbHNlCiAgICBFVlBfTURfQ1RYX2luaXQoY3B0cik7CiNlbmRpZgojZW5kaWYKICAgIGlmICghRVZQX0RpZ2VzdEluaXQoY3B0ciwgaGFzaGZuKSkgewogICAgICAgIC8qIHJlcXVlc3RlZCBoYXNoIGZ1bmN0aW9uIGlzIG5vdCBhdmFpbGFibGUgKi8KICAgICAgICByZXR1cm4gU05NUEVSUl9TQ19OT1RfQ09ORklHVVJFRDsKICAgIH0KCi8qKiBwYXNzIHRoZSBkYXRhICovCiAgICBFVlBfRGlnZXN0VXBkYXRlKGNwdHIsIGJ1ZiwgYnVmX2xlbik7CgovKiogZG8gdGhlIGZpbmFsIHBhc3MgKi8KICAgIEVWUF9EaWdlc3RGaW5hbChjcHRyLCBNQUMsICZ0bXBfbGVuKTsKICAgICpNQUNfbGVuID0gdG1wX2xlbjsKI2lmZGVmIEhBVkVfRVZQX01EX0NUWF9ERVNUUk9ZCiAgICBFVlBfTURfQ1RYX2Rlc3Ryb3koY3B0cik7CiNlbHNlCiNpZiAhZGVmaW5lZChPTERfREVTKQogICAgRVZQX01EX0NUWF9jbGVhbnVwKGNwdHIpOwojZW5kaWYKICAgIGZyZWUoY3B0cik7CiNlbmRpZgogICAgcmV0dXJuIChydmFsKTsKCiNlbGlmIE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIGlmIChJU1RSQU5TRk9STShoYXNodHlwZSwgSE1BQ01ENUF1dGgpKSB7CiAgICAgICAgaWYgKCpNQUNfbGVuIDwgTUQ1X0RJR0VTVF9MRU5HVEgpCiAgICAgICAgICAgIHJldHVybiAoU05NUEVSUl9HRU5FUlIpOyAgICAgIC8qIHRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCAqLwoJTUQ1X0luaXQoJmNtZDUpOwogICAgICAgIE1ENV9VcGRhdGUoJmNtZDUsIGJ1ZiwgYnVmX2xlbik7CiAgICAgICAgTUQ1X0ZpbmFsKE1BQywgJmNtZDUpOwogICAgICAgICpNQUNfbGVuID0gTUQ1X0RJR0VTVF9MRU5HVEg7CiAgICB9IGVsc2UgCiNlbmRpZgogICAgaWYgKElTVFJBTlNGT1JNKGhhc2h0eXBlLCBITUFDU0hBMUF1dGgpKSB7CiAgICAgICAgaWYgKCpNQUNfbGVuIDwgU0hBX0RJR0VTVF9MRU5HVEgpCiAgICAgICAgICAgIHJldHVybiAoU05NUEVSUl9HRU5FUlIpOyAgICAgIC8qIHRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCAqLwoJU0hBMV9Jbml0KCZjc2hhMSk7CiAgICAgICAgU0hBMV9VcGRhdGUoJmNzaGExLCBidWYsIGJ1Zl9sZW4pOwogICAgICAgIFNIQTFfRmluYWwoTUFDLCAmY3NoYTEpOwogICAgICAgICpNQUNfbGVuID0gU0hBX0RJR0VTVF9MRU5HVEg7CiAgICAgICAgICAgIAogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gKFNOTVBFUlJfR0VORVJSKTsKICAgIH0KICAgIHJldHVybiAocnZhbCk7CiNlbGlmIE5FVFNOTVBfVVNFX1BLQ1MxMSAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX1BLQ1MxMSAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUQ1CiAgICBpZiAoSVNUUkFOU0ZPUk0oaGFzaHR5cGUsIEhNQUNNRDVBdXRoKSkgewoJcnZhbCA9IHBrY3NfZGlnZXN0KENLTV9NRDUsIGJ1ZiwgYnVmX2xlbiwgTUFDLCAmdG1wX2xlbik7CiAgICAgICAgKk1BQ19sZW4gPSB0bXBfbGVuOwogICAgfSBlbHNlCiNlbmRpZgogICAgICAgIGlmIChJU1RSQU5TRk9STShoYXNodHlwZSwgSE1BQ1NIQTFBdXRoKSkgewoJcnZhbCA9IHBrY3NfZGlnZXN0KENLTV9TSEFfMSwgYnVmLCBidWZfbGVuLCBNQUMsICZ0bXBfbGVuKTsKICAgICAgICAqTUFDX2xlbiA9IHRtcF9sZW47CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAoU05NUEVSUl9HRU5FUlIpOwogICAgfQoKICAgICByZXR1cm4gKHJ2YWwpOwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUgKi8KCiAgICBpZiAoTURjaGVja3N1bShidWYsIGJ1Zl9sZW4sIE1BQywgKk1BQ19sZW4pKSB7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfQogICAgaWYgKCpNQUNfbGVuID4gMTYpCiAgICAgICAgKk1BQ19sZW4gPSAxNjsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX09QRU5TU0wgKi8KfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpICYmICFkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSkgKi8KX1NDQVBJX05PVF9DT05GSUdVUkVECiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIWRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgJiYgIWRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1KSAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBzY19jaGVja19rZXllZF9oYXNoCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBhdXRodHlwZQlUcmFuc2Zvcm0gdHlwZSBvZiBhdXRoZW50aWNhdGlvbiBoYXNoLgogKgkqa2V5CQlLZXkgYml0cyBpbiBhIHN0cmluZyBvZiBieXRlcy4KICoJIGtleWxlbgkJTGVuZ3RoIG9mIGtleSBpbiBieXRlcy4KICoJKm1lc3NhZ2UJTWVzc2FnZSBmb3Igd2hpY2ggdG8gY2hlY2sgdGhlIGhhc2guCiAqCSBtc2dsZW4JCUxlbmd0aCBvZiBtZXNzYWdlLgogKgkqTUFDCQlHaXZlbiBoYXNoLgogKgkgbWFjbGVuCQlMZW5ndGggb2YgZ2l2ZW4gaGFzaDsgaW5kaWNhdGVzIHRydW5jYXRpb24gaWYgaXQgaXMKICoJCQkJc2hvcnRlciB0aGFuIHRoZSBub3JtYWwgc2l6ZSBvZiBvdXRwdXQgZm9yCiAqCQkJCWdpdmVuIGhhc2ggdHJhbnNmb3JtLgogKiBSZXR1cm5zOgogKglTTk1QRVJSX1NVQ0NFU1MJCVN1Y2Nlc3MuCiAqCVNOTVBfU0NfR0VORVJBTF9GQUlMVVJFCUFueSBlcnJvcgogKgogKgogKiBDaGVjayB0aGUgaGFzaCBnaXZlbiBpbiBNQUMgYWdhaW5zdCB0aGUgaGFzaCBvZiBtZXNzYWdlLiAgSWYgdGhlIGxlbmd0aAogKiBvZiBNQUMgaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHRyYW5zZm9ybSBoYXNoIG91dHB1dCwgb25seSBtYWNsZW4KICogYnl0ZXMgYXJlIGNvbXBhcmVkLiAgVGhlIGxlbmd0aCBvZiBNQUMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUKICogbGVuZ3RoIG9mIHRoZSBoYXNoIHRyYW5zZm9ybSBvdXRwdXQuCiAqLwppbnQKc2NfY2hlY2tfa2V5ZWRfaGFzaChjb25zdCBvaWQgKiBhdXRodHlwZSwgc2l6ZV90IGF1dGh0eXBlbGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIGtleSwgdV9pbnQga2V5bGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIG1lc3NhZ2UsIHVfaW50IG1zZ2xlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBNQUMsIHVfaW50IG1hY2xlbikKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1KSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfUEtDUzExKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTykKewogICAgaW50ICAgICAgICAgICAgIHJ2YWwgPSBTTk1QRVJSX1NVQ0NFU1M7CiAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IFNOTVBfTUFYQlVGX1NNQUxMOwoKICAgIHVfY2hhciAgICAgICAgICBidWZbU05NUF9NQVhCVUZfU01BTExdOwoKICAgIERFQlVHVFJBQ0U7CgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGk7CiAgICAgICAgREVCVUdNU0coKCJzY2FwaSIsICJzY19jaGVja19rZXllZF9oYXNoKCk6ICAgIGtleT0weCIpKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5bGVuOyBpKyspCiAgICAgICAgICAgIERFQlVHTVNHKCgic2NhcGkiLCAiJTAyeCIsIGtleVtpXSAmIDB4ZmYpKTsKICAgICAgICBERUJVR01TRygoInNjYXBpIiwgIiAoJWQpXG4iLCBrZXlsZW4pKTsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCiAgICAvKgogICAgICogU2FuaXR5IGNoZWNrLgogICAgICovCiAgICBpZiAoIWF1dGh0eXBlIHx8ICFrZXkgfHwgIW1lc3NhZ2UgfHwgIU1BQwogICAgICAgIHx8IChrZXlsZW4gPD0gMCkgfHwgKG1zZ2xlbiA8PSAwKSB8fCAobWFjbGVuIDw9IDApCiAgICAgICAgfHwgKGF1dGh0eXBlbGVuICE9IFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSkpIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19jaGVja19rZXllZF9oYXNoX3F1aXQpOwogICAgfQoKCiAgICBpZiAobWFjbGVuICE9IFVTTV9NRDVfQU5EX1NIQV9BVVRIX0xFTikgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2NoZWNrX2tleWVkX2hhc2hfcXVpdCk7CiAgICB9CiAgICAKICAgIC8qCiAgICAgKiBHZW5lcmF0ZSBhIGZ1bGwgaGFzaCBvZiB0aGUgbWVzc2FnZSwgdGhlbiBjb21wYXJlCiAgICAgKiB0aGUgcmVzdWx0IHdpdGggdGhlIGdpdmVuIE1BQyB3aGljaCBtYXkgc2hvcnRlciB0aGFuCiAgICAgKiB0aGUgZnVsbCBoYXNoIGxlbmd0aC4KICAgICAqLwogICAgcnZhbCA9IHNjX2dlbmVyYXRlX2tleWVkX2hhc2goYXV0aHR5cGUsIGF1dGh0eXBlbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCBrZXlsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBtc2dsZW4sIGJ1ZiwgJmJ1Zl9sZW4pOwogICAgUVVJVEZVTihydmFsLCBzY19jaGVja19rZXllZF9oYXNoX3F1aXQpOwoKICAgIGlmIChtYWNsZW4gPiBtc2dsZW4pIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19jaGVja19rZXllZF9oYXNoX3F1aXQpOwoKICAgIH0gZWxzZSBpZiAobWVtY21wKGJ1ZiwgTUFDLCBtYWNsZW4pICE9IDApIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19jaGVja19rZXllZF9oYXNoX3F1aXQpOwogICAgfQoKCiAgc2NfY2hlY2tfa2V5ZWRfaGFzaF9xdWl0OgogICAgbWVtc2V0KGJ1ZiwgMCwgU05NUF9NQVhCVUZfU01BTEwpOwoKICAgIHJldHVybiBydmFsOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgc2NfY2hlY2tfa2V5ZWRfaGFzaCgpICovCgojZWxzZQpfU0NBUElfTk9UX0NPTkZJR1VSRUQKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogc2NfZW5jcnlwdAogKgogKiBQYXJhbWV0ZXJzOgogKgkgcHJpdnR5cGUJVHlwZSBvZiBwcml2YWN5IGNyeXB0b2dyYXBoaWMgdHJhbnNmb3JtLgogKgkqa2V5CQlLZXkgYml0cyBmb3IgY3J5cHRpbmcuCiAqCSBrZXlsZW4JCUxlbmd0aCBvZiBrZXkgKGJ1ZmZlcikgaW4gYnl0ZXMuCiAqCSppdgkJSVYgYml0cyBmb3IgY3J5cHRpbmcuCiAqCSBpdmxlbgkJTGVuZ3RoIG9mIGl2IChidWZmZXIpIGluIGJ5dGVzLgogKgkqcGxhaW50ZXh0CVBsYWludGV4dCB0byBjcnlwdC4KICoJIHB0bGVuCQlMZW5ndGggb2YgcGxhaW50ZXh0LgogKgkqY2lwaGVydGV4dAlDaXBoZXJ0ZXh0IHRvIGNyeXB0LgogKgkqY3RsZW4JCUxlbmd0aCBvZiBjaXBoZXJ0ZXh0LgogKiAgICAgIAogKiBSZXR1cm5zOgogKglTTk1QRVJSX1NVQ0NFU1MJCQlTdWNjZXNzLgogKglTTk1QRVJSX1NDX05PVF9DT05GSUdVUkVECUVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZC4KICoJU05NUEVSUl9TQ19HRU5FUkFMX0ZBSUxVUkUJQW55IG90aGVyIGVycm9yCiAqCiAqCiAqIEVuY3J5cHQgcGxhaW50ZXh0IGludG8gY2lwaGVydGV4dCB1c2luZyBrZXkgYW5kIGl2LgogKgogKiBjdGxlbiBjb250YWlucyBhY3R1YWwgbnVtYmVyIG9mIGNyeXB0ZWQgYnl0ZXMgaW4gY2lwaGVydGV4dCB1cG9uCiAqIHN1Y2Nlc3NmdWwgcmV0dXJuLgogKi8KaW50CnNjX2VuY3J5cHQoY29uc3Qgb2lkICogcHJpdnR5cGUsIHNpemVfdCBwcml2dHlwZWxlbiwKICAgICAgICAgICB1X2NoYXIgKiBrZXksIHVfaW50IGtleWxlbiwKICAgICAgICAgICB1X2NoYXIgKiBpdiwgdV9pbnQgaXZsZW4sCiAgICAgICAgICAgY29uc3QgdV9jaGFyICogcGxhaW50ZXh0LCB1X2ludCBwdGxlbiwKICAgICAgICAgICB1X2NoYXIgKiBjaXBoZXJ0ZXh0LCBzaXplX3QgKiBjdGxlbikKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8pCnsKICAgIGludCAgICAgICAgICAgICBydmFsID0gU05NUEVSUl9TVUNDRVNTOwogICAgdV9pbnQgICAgICAgICAgIHByb3Blcmxlbmd0aCA9IDAsIHByb3Blcmxlbmd0aF9pdiA9IDA7CiAgICB1X2NoYXIgICAgICAgICAgcGFkX2Jsb2NrWzEyOF07ICAgICAgLyogYmlnZ2VyIHRoYW4gYW55dGhpbmcgSSBuZWVkICovCiAgICB1X2NoYXIgICAgICAgICAgbXlfaXZbMTI4XTsgIC8qIGRpdHRvICovCiAgICBpbnQgICAgICAgICAgICAgcGFkLCBwbGFzdCwgcGFkX3NpemUgPSAwOwogICAgaW50ICAgICAgICAgICAgIGhhdmVfdHJhbnM7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwojaWZkZWYgT0xEX0RFUwogICAgREVTX2tleV9zY2hlZHVsZSBrZXlfc2NoOwojZWxzZQogICAgREVTX2tleV9zY2hlZHVsZSBrZXlfc2NoZWRfc3RvcmU7CiAgICBERVNfa2V5X3NjaGVkdWxlICprZXlfc2NoID0gJmtleV9zY2hlZF9zdG9yZTsKI2VuZGlmCiAgICBERVNfY2Jsb2NrICAgICAgIGtleV9zdHJ1Y3Q7CiNlbmRpZgojaWZkZWYgSEFWRV9BRVMKICAgIEFFU19LRVkgYWVzX2tleTsKICAgIGludCBuZXdfaXZsZW4gPSAwOwojZW5kaWYKCiAgICBERUJVR1RSQUNFOwoKICAgIC8qCiAgICAgKiBTYW5pdHkgY2hlY2suCiAgICAgKi8KI2lmCSFkZWZpbmVkKE5FVFNOTVBfRU5BQkxFX1NDQVBJX0FVVEhQUklWKQogICAgc25tcF9sb2coTE9HX0VSUiwgIkVuY3J5cHRpb24gc3VwcG9ydCBub3QgZW5hYmxlZC5cbiIpOwogICAgcmV0dXJuIFNOTVBFUlJfU0NfTk9UX0NPTkZJR1VSRUQ7CiNlbmRpZgoKICAgIGlmICghcHJpdnR5cGUgfHwgIWtleSB8fCAhaXYgfHwgIXBsYWludGV4dCB8fCAhY2lwaGVydGV4dCB8fCAhY3RsZW4KICAgICAgICB8fCAoa2V5bGVuIDw9IDApIHx8IChpdmxlbiA8PSAwKSB8fCAocHRsZW4gPD0gMCkgfHwgKCpjdGxlbiA8PSAwKQogICAgICAgIHx8IChwcml2dHlwZWxlbiAhPSBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0pKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZW5jcnlwdF9xdWl0KTsKICAgIH0gZWxzZSBpZiAocHRsZW4gPiAqY3RsZW4pIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19lbmNyeXB0X3F1aXQpOwogICAgfQojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICB7CiAgICAgICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSAxMjgsIG91dF9sZW4gPSAwOwogICAgICAgIHVfY2hhciAgICAgICAgICpidWYgPSAodV9jaGFyICopIG1hbGxvYyhidWZfbGVuKTsKCiAgICAgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2LCBpdmxlbikpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzY2FwaSIsICJlbmNyeXB0OiBJVjogJXMvIiwgYnVmKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgic2NhcGkiLCAiZW5jcnlwdDogSVY6ICVzIFtUUlVOQ0FURURdLyIsIGJ1ZikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgICAgICAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIGtleWxlbikpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHKCgic2NhcGkiLCAiJXNcbiIsIGJ1ZikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0coKCJzY2FwaSIsICIlcyBbVFJVTkNBVEVEXVxuIiwgYnVmKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICAgICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWludGV4dCwgMTYpKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgic2NhcGkiLCAiZW5jcnlwdDogc3RyaW5nOiAlc1xuIiwgYnVmKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgic2NhcGkiLCAiZW5jcnlwdDogc3RyaW5nOiAlcyBbVFJVTkNBVEVEXVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgic2NhcGkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZW5jcnlwdDogbWFsbG9jIGZhaWwgZm9yIGRlYnVnIG91dHB1dFxuIikpOwogICAgICAgIH0KICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCgogICAgLyoKICAgICAqIERldGVybWluZSBwcml2YWN5IHRyYW5zZm9ybS4KICAgICAqLwogICAgaGF2ZV90cmFucyA9IDA7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBERVNQcml2KSkgewogICAgICAgIHByb3Blcmxlbmd0aCA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl8xREVTKTsKICAgICAgICBwcm9wZXJsZW5ndGhfaXYgPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fMURFU19JVik7CiAgICAgICAgcGFkX3NpemUgPSBwcm9wZXJsZW5ndGg7CiAgICAgICAgaGF2ZV90cmFucyA9IDE7CiAgICB9CiNlbmRpZgojaWZkZWYgSEFWRV9BRVMKICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgQUVTUHJpdikpIHsKICAgICAgICBwcm9wZXJsZW5ndGggPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fQUVTKTsKICAgICAgICBwcm9wZXJsZW5ndGhfaXYgPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fQUVTX0lWKTsKICAgICAgICBoYXZlX3RyYW5zID0gMTsKICAgIH0KI2VuZGlmCiAgICBpZiAoIWhhdmVfdHJhbnMpIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19lbmNyeXB0X3F1aXQpOwogICAgfQoKICAgIGlmICgoa2V5bGVuIDwgcHJvcGVybGVuZ3RoKSB8fCAoaXZsZW4gPCBwcm9wZXJsZW5ndGhfaXYpKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZW5jcnlwdF9xdWl0KTsKICAgIH0KCiAgICBtZW1zZXQobXlfaXYsIDAsIHNpemVvZihteV9pdikpOwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIERFU1ByaXYpKSB7CgogICAgICAgIC8qCiAgICAgICAgICogbm93IGNhbGN1bGF0ZSB0aGUgcGFkZGluZyBuZWVkZWQgCiAgICAgICAgICovCiAgICAgICAgcGFkID0gcGFkX3NpemUgLSAocHRsZW4gJSBwYWRfc2l6ZSk7CiAgICAgICAgcGxhc3QgPSAoaW50KSBwdGxlbiAtIChwYWRfc2l6ZSAtIHBhZCk7CiAgICAgICAgaWYgKHBhZCA9PSBwYWRfc2l6ZSkKICAgICAgICAgICAgcGFkID0gMDsKICAgICAgICBpZiAocHRsZW4gKyBwYWQgPiAqY3RsZW4pIHsKICAgICAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZW5jcnlwdF9xdWl0KTsgICAgLyogbm90IGVub3VnaCBzcGFjZSAqLwogICAgICAgIH0KICAgICAgICBpZiAocGFkID4gMCkgeyAgICAgICAgICAgICAgLyogY29weSBkYXRhIGludG8gcGFkIGJsb2NrIGlmIG5lZWRlZCAqLwogICAgICAgICAgICBtZW1jcHkocGFkX2Jsb2NrLCBwbGFpbnRleHQgKyBwbGFzdCwgcGFkX3NpemUgLSBwYWQpOwogICAgICAgICAgICBtZW1zZXQoJnBhZF9ibG9ja1twYWRfc2l6ZSAtIHBhZF0sIHBhZCwgcGFkKTsgICAvKiBmaWxsaW5nIGluIHBhZGJsb2NrICovCiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoa2V5X3N0cnVjdCwga2V5LCBzaXplb2Yoa2V5X3N0cnVjdCkpOwogICAgICAgICh2b2lkKSBERVNfa2V5X3NjaGVkKCZrZXlfc3RydWN0LCBrZXlfc2NoKTsKCiAgICAgICAgbWVtY3B5KG15X2l2LCBpdiwgaXZsZW4pOwogICAgICAgIC8qCiAgICAgICAgICogZW5jcnlwdCB0aGUgZGF0YSAKICAgICAgICAgKi8KICAgICAgICBERVNfbmNiY19lbmNyeXB0KHBsYWludGV4dCwgY2lwaGVydGV4dCwgcGxhc3QsIGtleV9zY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAoREVTX2NibG9jayAqKSBteV9pdiwgREVTX0VOQ1JZUFQpOwogICAgICAgIGlmIChwYWQgPiAwKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHRoZW4gZW5jcnlwdCB0aGUgcGFkIGJsb2NrIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgREVTX25jYmNfZW5jcnlwdChwYWRfYmxvY2ssIGNpcGhlcnRleHQgKyBwbGFzdCwgcGFkX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3NjaCwgKERFU19jYmxvY2sgKikgbXlfaXYsIERFU19FTkNSWVBUKTsKICAgICAgICAgICAgKmN0bGVuID0gcGxhc3QgKyBwYWRfc2l6ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAqY3RsZW4gPSBwbGFzdDsKICAgICAgICB9CiAgICB9CiNlbmRpZgojaWZkZWYgSEFWRV9BRVMKICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgQUVTUHJpdikpIHsKICAgICAgICAodm9pZCkgQUVTX3NldF9lbmNyeXB0X2tleShrZXksIHByb3Blcmxlbmd0aCo4LCAmYWVzX2tleSk7CgogICAgICAgIG1lbWNweShteV9pdiwgaXYsIGl2bGVuKTsKICAgICAgICAvKgogICAgICAgICAqIGVuY3J5cHQgdGhlIGRhdGEgCiAgICAgICAgICovCiAgICAgICAgQUVTX2NmYjEyOF9lbmNyeXB0KHBsYWludGV4dCwgY2lwaGVydGV4dCwgcHRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZXNfa2V5LCBteV9pdiwgJm5ld19pdmxlbiwgQUVTX0VOQ1JZUFQpOwogICAgICAgICpjdGxlbiA9IHB0bGVuOwogICAgfQojZW5kaWYKICBzY19lbmNyeXB0X3F1aXQ6CiAgICAvKgogICAgICogY2xlYXIgbWVtb3J5IGp1c3QgaW4gY2FzZSAKICAgICAqLwogICAgbWVtc2V0KG15X2l2LCAwLCBzaXplb2YobXlfaXYpKTsKICAgIG1lbXNldChwYWRfYmxvY2ssIDAsIHNpemVvZihwYWRfYmxvY2spKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICBtZW1zZXQoa2V5X3N0cnVjdCwgMCwgc2l6ZW9mKGtleV9zdHJ1Y3QpKTsKI2lmZGVmIE9MRF9ERVMKICAgIG1lbXNldCgma2V5X3NjaCwgMCwgc2l6ZW9mKGtleV9zY2gpKTsKI2Vsc2UKICAgIG1lbXNldCgma2V5X3NjaGVkX3N0b3JlLCAwLCBzaXplb2Yoa2V5X3NjaGVkX3N0b3JlKSk7CiNlbmRpZgojZW5kaWYKI2lmZGVmIEhBVkVfQUVTCiAgICBtZW1zZXQoJmFlc19rZXksMCxzaXplb2YoYWVzX2tleSkpOwojZW5kaWYKICAgIHJldHVybiBydmFsOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgc2NfZW5jcnlwdCgpICovCiNlbGlmIGRlZmluZWQoTkVUU05NUF9VU0VfUEtDUzExKQp7CiAgICBpbnQgICAgICAgICAgICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKICAgIHVfaW50ICAgICAgICAgICBwcm9wZXJsZW5ndGgsIHByb3Blcmxlbmd0aF9pdjsKICAgIHVfY2hhcgkgICAgcGtjc19kZXNfa2V5WzhdOwoKICAgIERFQlVHVFJBQ0U7CgogICAgLyoKICAgICAqIFNhbml0eSBjaGVjay4KICAgICAqLwojaWYJIWRlZmluZWQoTkVUU05NUF9FTkFCTEVfU0NBUElfQVVUSFBSSVYpCiAgICBzbm1wX2xvZyhMT0dfRVJSLCAiRW5jcnlwdGlvbiBzdXBwb3J0IG5vdCBlbmFibGVkLlxuIik7CiAgICByZXR1cm4gU05NUEVSUl9TQ19OT1RfQ09ORklHVVJFRDsKI2VuZGlmCgogICAgaWYgKCFwcml2dHlwZSB8fCAha2V5IHx8ICFpdiB8fCAhcGxhaW50ZXh0IHx8ICFjaXBoZXJ0ZXh0IHx8ICFjdGxlbgogICAgICAgIHx8IChrZXlsZW4gPD0gMCkgfHwgKGl2bGVuIDw9IDApIHx8IChwdGxlbiA8PSAwKSB8fCAoKmN0bGVuIDw9IDApCiAgICAgICAgfHwgKHByaXZ0eXBlbGVuICE9IFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSkpIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19lbmNyeXB0X3F1aXQpOwogICAgfSBlbHNlIGlmIChwdGxlbiA+ICpjdGxlbikgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2VuY3J5cHRfcXVpdCk7CiAgICB9CgogICAgLyoKICAgICAqIERldGVybWluZSBwcml2YWN5IHRyYW5zZm9ybS4KICAgICAqLwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBERVNQcml2KSkgewogICAgICAgIHByb3Blcmxlbmd0aCA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl8xREVTKTsKICAgICAgICBwcm9wZXJsZW5ndGhfaXYgPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fMURFU19JVik7CiAgICB9IGVsc2UgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2VuY3J5cHRfcXVpdCk7CiAgICB9CgogICAgaWYgKChrZXlsZW4gPCBwcm9wZXJsZW5ndGgpIHx8IChpdmxlbiA8IHByb3Blcmxlbmd0aF9pdikpIHsKCVFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2VuY3J5cHRfcXVpdCk7CiAgICB9CgogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBERVNQcml2KSkgewoJbWVtc2V0KHBrY3NfZGVzX2tleSwgMCwgc2l6ZW9mKHBrY3NfZGVzX2tleSkpOwoJbWVtY3B5KHBrY3NfZGVzX2tleSwga2V5LCBzaXplb2YocGtjc19kZXNfa2V5KSk7CglydmFsID0gcGtjc19lbmNycHl0KENLTV9ERVNfQ0JDLCBwa2NzX2Rlc19rZXksCgkJc2l6ZW9mKHBrY3NfZGVzX2tleSksIGl2LCBpdmxlbiwgcGxhaW50ZXh0LCBwdGxlbiwKCQljaXBoZXJ0ZXh0LCBjdGxlbik7CiAgICB9CgogIHNjX2VuY3J5cHRfcXVpdDoKICAgIHJldHVybiBydmFsOwp9CiNlbHNlCnsKIwlpZiBORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUKICAgIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiRW5jcnlwdGlvbiBzdXBwb3J0IG5vdCBlbmFibGVkLlxuIik7CiAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgIkVuY3J5cHQgZnVuY3Rpb24gbm90IGRlZmluZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU0NfR0VORVJBTF9GQUlMVVJFOwogICAgfQoKIwllbHNlCiAgICBfU0NBUElfTk9UX0NPTkZJR1VSRUQKIwllbmRpZiAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUgKi8KfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHNjX2RlY3J5cHQKICoKICogUGFyYW1ldGVyczoKICoJIHByaXZ0eXBlCiAqCSprZXkKICoJIGtleWxlbgogKgkqaXYKICoJIGl2bGVuCiAqCSpjaXBoZXJ0ZXh0CiAqCSBjdGxlbgogKgkqcGxhaW50ZXh0CiAqCSpwdGxlbgogKiAgICAgIAogKiBSZXR1cm5zOgogKglTTk1QRVJSX1NVQ0NFU1MJCQlTdWNjZXNzLgogKglTTk1QRVJSX1NDX05PVF9DT05GSUdVUkVECUVuY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZC4KICogICAgICBTTk1QRVJSX1NDX0dFTkVSQUxfRkFJTFVSRSAgICAgIEFueSBvdGhlciBlcnJvcgogKgogKgogKiBEZWNyeXB0IGNpcGhlcnRleHQgaW50byBwbGFpbnRleHQgdXNpbmcga2V5IGFuZCBpdi4KICoKICogcHRsZW4gY29udGFpbnMgYWN0dWFsIG51bWJlciBvZiBwbGFpbnRleHQgYnl0ZXMgaW4gcGxhaW50ZXh0IHVwb24KICogc3VjY2Vzc2Z1bCByZXR1cm4uCiAqLwppbnQKc2NfZGVjcnlwdChjb25zdCBvaWQgKiBwcml2dHlwZSwgc2l6ZV90IHByaXZ0eXBlbGVuLAogICAgICAgICAgIHVfY2hhciAqIGtleSwgdV9pbnQga2V5bGVuLAogICAgICAgICAgIHVfY2hhciAqIGl2LCB1X2ludCBpdmxlbiwKICAgICAgICAgICB1X2NoYXIgKiBjaXBoZXJ0ZXh0LCB1X2ludCBjdGxlbiwKICAgICAgICAgICB1X2NoYXIgKiBwbGFpbnRleHQsIHNpemVfdCAqIHB0bGVuKQojaWYgZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTykKewoKICAgIGludCAgICAgICAgICAgICBydmFsID0gU05NUEVSUl9TVUNDRVNTOwogICAgdV9jaGFyICAgICAgICAgIG15X2l2WzEyOF07CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwojaWZkZWYgT0xEX0RFUwogICAgREVTX2tleV9zY2hlZHVsZSBrZXlfc2NoOwojZWxzZQogICAgREVTX2tleV9zY2hlZHVsZSBrZXlfc2NoZWRfc3RvcmU7CiAgICBERVNfa2V5X3NjaGVkdWxlICprZXlfc2NoID0gJmtleV9zY2hlZF9zdG9yZTsKI2VuZGlmCiAgICBERVNfY2Jsb2NrICAgICAga2V5X3N0cnVjdDsKI2VuZGlmCiAgICB1X2ludCAgICAgICAgICAgcHJvcGVybGVuZ3RoID0gMCwgcHJvcGVybGVuZ3RoX2l2ID0gMDsKICAgIGludCAgICAgICAgICAgICBoYXZlX3RyYW5zZm9ybTsKI2lmZGVmIEhBVkVfQUVTCiAgICBpbnQgbmV3X2l2bGVuID0gMDsKICAgIEFFU19LRVkgYWVzX2tleTsKI2VuZGlmCgogICAgREVCVUdUUkFDRTsKCiAgICBpZiAoIXByaXZ0eXBlIHx8ICFrZXkgfHwgIWl2IHx8ICFwbGFpbnRleHQgfHwgIWNpcGhlcnRleHQgfHwgIXB0bGVuCiAgICAgICAgfHwgKGN0bGVuIDw9IDApIHx8ICgqcHRsZW4gPD0gMCkgfHwgKCpwdGxlbiA8IGN0bGVuKQogICAgICAgIHx8IChwcml2dHlwZWxlbiAhPSBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0pKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZGVjcnlwdF9xdWl0KTsKICAgIH0KI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgewogICAgICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMTI4LCBvdXRfbGVuID0gMDsKICAgICAgICB1X2NoYXIgICAgICAgICAqYnVmID0gKHVfY2hhciAqKSBtYWxsb2MoYnVmX2xlbik7CgogICAgICAgIGlmIChidWYgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdiwgaXZsZW4pKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgic2NhcGkiLCAiZGVjcnlwdDogSVY6ICVzLyIsIGJ1ZikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgImRlY3J5cHQ6IElWOiAlcyBbVFJVTkNBVEVEXS8iLCBidWYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRfbGVuID0gMDsKICAgICAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX2hleHN0cmluZygmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCBrZXlsZW4pKSB7CiAgICAgICAgICAgICAgICBERUJVR01TRygoInNjYXBpIiwgIiVzXG4iLCBidWYpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHKCgic2NhcGkiLCAiJXNcbiIsIGJ1ZikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgic2NhcGkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVjcnlwdDogbWFsbG9jIGZhaWwgZm9yIGRlYnVnIG91dHB1dFxuIikpOwogICAgICAgIH0KICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCiAgICAvKgogICAgICogRGV0ZXJtaW5lIHByaXZhY3kgdHJhbnNmb3JtLgogICAgICovCiAgICBoYXZlX3RyYW5zZm9ybSA9IDA7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBERVNQcml2KSkgewogICAgICAgIHByb3Blcmxlbmd0aCA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl8xREVTKTsKICAgICAgICBwcm9wZXJsZW5ndGhfaXYgPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fMURFU19JVik7CiAgICAgICAgaGF2ZV90cmFuc2Zvcm0gPSAxOwogICAgfQojZW5kaWYKI2lmZGVmIEhBVkVfQUVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIEFFU1ByaXYpKSB7CiAgICAgICAgcHJvcGVybGVuZ3RoID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOX0FFUyk7CiAgICAgICAgcHJvcGVybGVuZ3RoX2l2ID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOX0FFU19JVik7CiAgICAgICAgaGF2ZV90cmFuc2Zvcm0gPSAxOwogICAgfQojZW5kaWYKICAgIGlmICghaGF2ZV90cmFuc2Zvcm0pIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19kZWNyeXB0X3F1aXQpOwogICAgfQoKICAgIGlmICgoa2V5bGVuIDwgcHJvcGVybGVuZ3RoKSB8fCAoaXZsZW4gPCBwcm9wZXJsZW5ndGhfaXYpKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZGVjcnlwdF9xdWl0KTsKICAgIH0KCiAgICBtZW1zZXQobXlfaXYsIDAsIHNpemVvZihteV9pdikpOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgREVTUHJpdikpIHsKICAgICAgICBtZW1jcHkoa2V5X3N0cnVjdCwga2V5LCBzaXplb2Yoa2V5X3N0cnVjdCkpOwogICAgICAgICh2b2lkKSBERVNfa2V5X3NjaGVkKCZrZXlfc3RydWN0LCBrZXlfc2NoKTsKCiAgICAgICAgbWVtY3B5KG15X2l2LCBpdiwgaXZsZW4pOwogICAgICAgIERFU19jYmNfZW5jcnlwdChjaXBoZXJ0ZXh0LCBwbGFpbnRleHQsIGN0bGVuLCBrZXlfc2NoLAogICAgICAgICAgICAgICAgICAgICAgICAoREVTX2NibG9jayAqKSBteV9pdiwgREVTX0RFQ1JZUFQpOwogICAgICAgICpwdGxlbiA9IGN0bGVuOwogICAgfQojZW5kaWYKI2lmZGVmIEhBVkVfQUVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIEFFU1ByaXYpKSB7CiAgICAgICAgKHZvaWQpIEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5LCBwcm9wZXJsZW5ndGgqOCwgJmFlc19rZXkpOwoKICAgICAgICBtZW1jcHkobXlfaXYsIGl2LCBpdmxlbik7CiAgICAgICAgLyoKICAgICAgICAgKiBlbmNyeXB0IHRoZSBkYXRhIAogICAgICAgICAqLwogICAgICAgIEFFU19jZmIxMjhfZW5jcnlwdChjaXBoZXJ0ZXh0LCBwbGFpbnRleHQsIGN0bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmYWVzX2tleSwgbXlfaXYsICZuZXdfaXZsZW4sIEFFU19ERUNSWVBUKTsKICAgICAgICAqcHRsZW4gPSBjdGxlbjsKICAgIH0KI2VuZGlmCgogICAgLyoKICAgICAqIGV4aXQgY29uZCAKICAgICAqLwogIHNjX2RlY3J5cHRfcXVpdDoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiNpZmRlZiBPTERfREVTCiAgICBtZW1zZXQoJmtleV9zY2gsIDAsIHNpemVvZihrZXlfc2NoKSk7CiNlbHNlCiAgICBtZW1zZXQoJmtleV9zY2hlZF9zdG9yZSwgMCwgc2l6ZW9mKGtleV9zY2hlZF9zdG9yZSkpOwojZW5kaWYKICAgIG1lbXNldChrZXlfc3RydWN0LCAwLCBzaXplb2Yoa2V5X3N0cnVjdCkpOwojZW5kaWYKICAgIG1lbXNldChteV9pdiwgMCwgc2l6ZW9mKG15X2l2KSk7CiAgICByZXR1cm4gcnZhbDsKfQkJCQkvKiBVU0UgT1BFTl9TU0wgKi8KI2VsaWYgTkVUU05NUF9VU0VfUEtDUzExICAgICAgICAgICAgICAgICAgLyogVVNFIFBLQ1MgKi8KewogICAgaW50ICAgICAgICAgICAgIHJ2YWwgPSBTTk1QRVJSX1NVQ0NFU1M7CiAgICB1X2ludCAgICAgICAgICAgcHJvcGVybGVuZ3RoLCBwcm9wZXJsZW5ndGhfaXY7CiAgICB1X2NoYXIJICAgIHBrY3NfZGVzX2tleVs4XTsKCiAgICBERUJVR1RSQUNFOwoKICAgIGlmICghcHJpdnR5cGUgfHwgIWtleSB8fCAhaXYgfHwgIXBsYWludGV4dCB8fCAhY2lwaGVydGV4dCB8fCAhcHRsZW4KICAgICAgICB8fCAoY3RsZW4gPD0gMCkgfHwgKCpwdGxlbiA8PSAwKSB8fCAoKnB0bGVuIDwgY3RsZW4pCiAgICAgICAgfHwgKHByaXZ0eXBlbGVuICE9IFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSkpIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19kZWNyeXB0X3F1aXQpOwogICAgfQoKICAgIC8qCiAgICAgKiBEZXRlcm1pbmUgcHJpdmFjeSB0cmFuc2Zvcm0uCiAgICAgKi8KICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgREVTUHJpdikpIHsKICAgICAgICBwcm9wZXJsZW5ndGggPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fMURFUyk7CiAgICAgICAgcHJvcGVybGVuZ3RoX2l2ID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOXzFERVNfSVYpOwogICAgfSBlbHNlIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19kZWNyeXB0X3F1aXQpOwogICAgfQoKICAgIGlmICgoa2V5bGVuIDwgcHJvcGVybGVuZ3RoKSB8fCAoaXZsZW4gPCBwcm9wZXJsZW5ndGhfaXYpKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZGVjcnlwdF9xdWl0KTsKICAgIH0KCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIERFU1ByaXYpKSB7CgltZW1zZXQocGtjc19kZXNfa2V5LCAwLCBzaXplb2YocGtjc19kZXNfa2V5KSk7CgltZW1jcHkocGtjc19kZXNfa2V5LCBrZXksIHNpemVvZihwa2NzX2Rlc19rZXkpKTsKCXJ2YWwgPSBwa2NzX2RlY3JweXQoQ0tNX0RFU19DQkMsIHBrY3NfZGVzX2tleSwgCgkJc2l6ZW9mKHBrY3NfZGVzX2tleSksIGl2LCBpdmxlbiwgY2lwaGVydGV4dCwKCQljdGxlbiwgcGxhaW50ZXh0LCBwdGxlbik7CiAgICAgICAgKnB0bGVuID0gY3RsZW47CiAgICB9CgogIHNjX2RlY3J5cHRfcXVpdDoKICAgIHJldHVybiBydmFsOwp9CQkJCS8qIFVTRSBQS0NTICovCiNlbHNlCnsKI2lmCSFkZWZpbmVkKE5FVFNOTVBfRU5BQkxFX1NDQVBJX0FVVEhQUklWKQogICAgc25tcF9sb2coTE9HX0VSUiwgIkVuY3J5cHRpb24gc3VwcG9ydCBub3QgZW5hYmxlZC5cbiIpOwogICAgcmV0dXJuIFNOTVBFUlJfU0NfTk9UX0NPTkZJR1VSRUQ7CiNlbHNlCiMJaWYgTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1CiAgICB7CiAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgIkRlY3J5cHRpb24gZnVuY3Rpb24gbm90IGRlZmluZWQuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU0NfR0VORVJBTF9GQUlMVVJFOwogICAgfQoKIwllbHNlCiAgICBfU0NBUElfTk9UX0NPTkZJR1VSRUQKIwllbmRpZiAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKi8KfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX09QRU5TU0wgKi8KCiNpZmRlZiBORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8KCi8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYmFzaWNhbGx5IGNvcGllcyBvZiB0aGUgTURTaWduKCkgcm91dGluZSBpbgogICBtZDUuYyBtb2RpZmllZCB0byBiZSB1c2VkIHdpdGggdGhlIE9wZW5TU0wgaGFzaGluZyBmdW5jdGlvbnMuICBUaGUKICAgY29weXJpZ2h0IGJlbG93IGlzIGZyb20gdGhlIG1kNS5jIGZpbGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgd2VyZQogICB0YWtlbiBmcm9tOiAqLwoKLyoKICogKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogKiogbWQ1LmMgLS0gSW1wbGVtZW50YXRpb24gb2YgTUQ1IE1lc3NhZ2UgRGlnZXN0IEFsZ29yaXRobSAgICAgICAgICAgICAgICAgKioKICogKiogVXBkYXRlZDogMi8xNi85MCBieSBSb25hbGQgTC4gUml2ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKICogKiogKEMpIDE5OTAgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKICogKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgovKgogKiBNRDVfaG1hYyhkYXRhLCBsZW4sIE1ENSk6IGRvIGEgY2hlY2tzdW0gb24gYW4gYXJiaXJ0cmFyeSBhbW91bnQKICogb2YgZGF0YSwgYW5kIHByZXBlbmRlZCB3aXRoIGEgc2VjcmV0IGluIHRoZSBzdGFuZGFyZCBmYXNoaW9uIAogKi8Kc3RhdGljIGludApNRDVfaG1hYyhjb25zdCB1X2NoYXIgKiBkYXRhLCBzaXplX3QgbGVuLCB1X2NoYXIgKiBtYWMsIHNpemVfdCBtYWNsZW4sCiAgICAgICAgIGNvbnN0IHVfY2hhciAqIHNlY3JldCwgc2l6ZV90IHNlY3JldGxlbikKewojZGVmaW5lIE1ENV9IQVNIS0VZTEVOIDY0CiNkZWZpbmUgTUQ1X1NFQ1JFVEtFWUxFTiAxNgoKICAgIE1ENV9DVFggICAgICAgICBjbWQ1OwogICAgdV9jaGFyICAgICAgICAgIEsxW01ENV9IQVNIS0VZTEVOXTsKICAgIHVfY2hhciAgICAgICAgICBLMltNRDVfSEFTSEtFWUxFTl07CiAgICB1X2NoYXIgICAgICAgICAgZXh0ZW5kZWRBdXRoS2V5W01ENV9IQVNIS0VZTEVOXTsKICAgIHVfY2hhciAgICAgICAgICBidWZbTUQ1X0hBU0hLRVlMRU5dOwogICAgc2l6ZV90ICAgICAgICAgIGk7CiAgICBjb25zdCB1X2NoYXIgICAqY3A7CiAgICB1X2NoYXIgICAgICAgICAqbmV3ZGF0YSA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgcmMgPSAwOwoKICAgIC8qCiAgICAgKiBtZW1zZXQoSzEsMCxNRDVfSEFTSEtFWUxFTik7CiAgICAgKiBtZW1zZXQoSzIsMCxNRDVfSEFTSEtFWUxFTik7CiAgICAgKiBtZW1zZXQoYnVmLDAsTUQ1X0hBU0hLRVlMRU4pOwogICAgICogbWVtc2V0KGV4dGVuZGVkQXV0aEtleSwwLE1ENV9IQVNIS0VZTEVOKTsKICAgICAqLwoKICAgIGlmIChzZWNyZXRsZW4gIT0gTUQ1X1NFQ1JFVEtFWUxFTiB8fCBzZWNyZXQgPT0gTlVMTCB8fAogICAgICAgIG1hYyA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCB8fAogICAgICAgIGxlbiA8PSAwIHx8IG1hY2xlbiA8PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBERUJVR01TR1RMKCgibWQ1IiwiTUQ1IHNpZ25pbmcgbm90IHByb3Blcmx5IGluaXRpYWxpemVkIikpOyAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgbWVtc2V0KGV4dGVuZGVkQXV0aEtleSwgMCwgTUQ1X0hBU0hLRVlMRU4pOwogICAgbWVtY3B5KGV4dGVuZGVkQXV0aEtleSwgc2VjcmV0LCBzZWNyZXRsZW4pOwogICAgZm9yIChpID0gMDsgaSA8IE1ENV9IQVNIS0VZTEVOOyBpKyspIHsKICAgICAgICBLMVtpXSA9IGV4dGVuZGVkQXV0aEtleVtpXSBeIDB4MzY7CiAgICAgICAgSzJbaV0gPSBleHRlbmRlZEF1dGhLZXlbaV0gXiAweDVjOwogICAgfQoKICAgIE1ENV9Jbml0KCZjbWQ1KTsKICAgIHJjID0gIU1ENV9VcGRhdGUoJmNtZDUsIEsxLCBNRDVfSEFTSEtFWUxFTik7CiAgICBpZiAocmMpCiAgICAgICAgZ290byB1cGRhdGVfZW5kOwoKICAgIGkgPSBsZW47CiAgICBpZiAoKCh1aW50cHRyX3QpIGRhdGEpICUgc2l6ZW9mKGxvbmcpICE9IDApIHsKICAgICAgICAvKgogICAgICAgICAqIHRoaXMgcmVsaWVzIG9uIHRoZSBhYmlsaXR5IHRvIHVzZSBpbnRlZ2VyIG1hdGggYW5kIHRodXMgd2UKICAgICAgICAgKiBtdXN0IHJlbHkgb24gZGF0YSB0aGF0IGFsaWducyBvbiAzMi1iaXQtd29yZC1ib3VuZHJpZXMgCiAgICAgICAgICovCiAgICAgICAgbmV3ZGF0YSA9IG5ldHNubXBfbWVtZHVwKGRhdGEsIGxlbik7CiAgICAgICAgY3AgPSBuZXdkYXRhOwogICAgfSBlbHNlIHsKICAgICAgICBjcCA9IGRhdGE7CiAgICB9CgogICAgd2hpbGUgKGkgPj0gNjQpIHsKICAgICAgICByYyA9ICFNRDVfVXBkYXRlKCZjbWQ1LCBjcCwgNjQpOwogICAgICAgIGlmIChyYykKICAgICAgICAgICAgZ290byB1cGRhdGVfZW5kOwogICAgICAgIGNwICs9IDY0OwogICAgICAgIGkgLT0gNjQ7CiAgICB9CgogICAgcmMgPSAhTUQ1X1VwZGF0ZSgmY21kNSwgY3AsIGkpOwogICAgaWYgKHJjKQogICAgICAgIGdvdG8gdXBkYXRlX2VuZDsKCiAgICBtZW1zZXQoYnVmLCAwLCBNRDVfSEFTSEtFWUxFTik7CiAgICBNRDVfRmluYWwoYnVmLCAmY21kNSk7CgogICAgTUQ1X0luaXQoJmNtZDUpOwogICAgcmMgPSAhTUQ1X1VwZGF0ZSgmY21kNSwgSzIsIE1ENV9IQVNIS0VZTEVOKTsKICAgIGlmIChyYykKICAgICAgICBnb3RvIHVwZGF0ZV9lbmQ7CiAgICByYyA9ICFNRDVfVXBkYXRlKCZjbWQ1LCBidWYsIE1ENV9TRUNSRVRLRVlMRU4pOwogICAgaWYgKHJjKQogICAgICAgIGdvdG8gdXBkYXRlX2VuZDsKCiAgICAvKgogICAgICogY29weSB0aGUgc2lnbiBjaGVja3N1bSB0byB0aGUgb3V0Z29pbmcgcG9pbnRlciAKICAgICAqLwogICAgTUQ1X0ZpbmFsKGJ1ZiwgJmNtZDUpOwogICAgbWVtY3B5KG1hYywgYnVmLCBtYWNsZW4pOwoKICB1cGRhdGVfZW5kOgogICAgbWVtc2V0KGJ1ZiwgMCwgTUQ1X0hBU0hLRVlMRU4pOwogICAgbWVtc2V0KEsxLCAwLCBNRDVfSEFTSEtFWUxFTik7CiAgICBtZW1zZXQoSzIsIDAsIE1ENV9IQVNIS0VZTEVOKTsKICAgIG1lbXNldChleHRlbmRlZEF1dGhLZXksIDAsIE1ENV9IQVNIS0VZTEVOKTsKICAgIG1lbXNldCgmY21kNSwgMCwgc2l6ZW9mKGNtZDUpKTsKCiAgICBpZiAobmV3ZGF0YSkKICAgICAgICBmcmVlKG5ld2RhdGEpOwogICAgcmV0dXJuIHJjOwp9CgpzdGF0aWMgaW50ClNIQTFfaG1hYyhjb25zdCB1X2NoYXIgKiBkYXRhLCBzaXplX3QgbGVuLCB1X2NoYXIgKiBtYWMsIHNpemVfdCBtYWNsZW4sCiAgICAgICAgICBjb25zdCB1X2NoYXIgKiBzZWNyZXQsIHNpemVfdCBzZWNyZXRsZW4pCnsKI2RlZmluZSBTSEExX0hBU0hLRVlMRU4gICA2NAojZGVmaW5lIFNIQTFfU0VDUkVUS0VZTEVOIDIwCgogICAgU0hBX0NUWCAgICAgICAgIGNzaGExOwogICAgdV9jaGFyICAgICAgICAgIEsxW1NIQTFfSEFTSEtFWUxFTl07CiAgICB1X2NoYXIgICAgICAgICAgSzJbU0hBMV9IQVNIS0VZTEVOXTsKICAgIHVfY2hhciAgICAgICAgICBleHRlbmRlZEF1dGhLZXlbU0hBMV9IQVNIS0VZTEVOXTsKICAgIHVfY2hhciAgICAgICAgICBidWZbU0hBMV9IQVNIS0VZTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBpOwogICAgY29uc3QgdV9jaGFyICAgKmNwOwogICAgdV9jaGFyICAgICAgICAgKm5ld2RhdGEgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIHJjID0gMDsKCiAgICAvKgogICAgICogbWVtc2V0KEsxLDAsU0hBMV9IQVNIS0VZTEVOKTsKICAgICAqIG1lbXNldChLMiwwLFNIQTFfSEFTSEtFWUxFTik7CiAgICAgKiBtZW1zZXQoYnVmLDAsU0hBMV9IQVNIS0VZTEVOKTsKICAgICAqIG1lbXNldChleHRlbmRlZEF1dGhLZXksMCxTSEExX0hBU0hLRVlMRU4pOwogICAgICovCgogICAgaWYgKHNlY3JldGxlbiAhPSBTSEExX1NFQ1JFVEtFWUxFTiB8fCBzZWNyZXQgPT0gTlVMTCB8fAogICAgICAgIG1hYyA9PSBOVUxMIHx8IGRhdGEgPT0gTlVMTCB8fAogICAgICAgIGxlbiA8PSAwIHx8IG1hY2xlbiA8PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBERUJVR01TR1RMKCgic2hhMSIsIlNIQTEgc2lnbmluZyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQiKSk7IAogICAgICAgICAqLwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBtZW1zZXQoZXh0ZW5kZWRBdXRoS2V5LCAwLCBTSEExX0hBU0hLRVlMRU4pOwogICAgbWVtY3B5KGV4dGVuZGVkQXV0aEtleSwgc2VjcmV0LCBzZWNyZXRsZW4pOwogICAgZm9yIChpID0gMDsgaSA8IFNIQTFfSEFTSEtFWUxFTjsgaSsrKSB7CiAgICAgICAgSzFbaV0gPSBleHRlbmRlZEF1dGhLZXlbaV0gXiAweDM2OwogICAgICAgIEsyW2ldID0gZXh0ZW5kZWRBdXRoS2V5W2ldIF4gMHg1YzsKICAgIH0KCiAgICBTSEExX0luaXQoJmNzaGExKTsKICAgIHJjID0gIVNIQTFfVXBkYXRlKCZjc2hhMSwgSzEsIFNIQTFfSEFTSEtFWUxFTik7CiAgICBpZiAocmMpCiAgICAgICAgZ290byB1cGRhdGVfZW5kOwoKICAgIGkgPSBsZW47CiAgICBpZiAoKCh1aW50cHRyX3QpIGRhdGEpICUgc2l6ZW9mKGxvbmcpICE9IDApIHsKICAgICAgICAvKgogICAgICAgICAqIHRoaXMgcmVsaWVzIG9uIHRoZSBhYmlsaXR5IHRvIHVzZSBpbnRlZ2VyIG1hdGggYW5kIHRodXMgd2UKICAgICAgICAgKiBtdXN0IHJlbHkgb24gZGF0YSB0aGF0IGFsaWducyBvbiAzMi1iaXQtd29yZC1ib3VuZHJpZXMgCiAgICAgICAgICovCiAgICAgICAgbmV3ZGF0YSA9IG5ldHNubXBfbWVtZHVwKGRhdGEsIGxlbik7CiAgICAgICAgY3AgPSBuZXdkYXRhOwogICAgfSBlbHNlIHsKICAgICAgICBjcCA9IGRhdGE7CiAgICB9CgogICAgd2hpbGUgKGkgPj0gNjQpIHsKICAgICAgICByYyA9ICFTSEExX1VwZGF0ZSgmY3NoYTEsIGNwLCA2NCk7CiAgICAgICAgaWYgKHJjKQogICAgICAgICAgICBnb3RvIHVwZGF0ZV9lbmQ7CiAgICAgICAgY3AgKz0gNjQ7CiAgICAgICAgaSAtPSA2NDsKICAgIH0KCiAgICByYyA9ICFTSEExX1VwZGF0ZSgmY3NoYTEsIGNwLCBpKTsKICAgIGlmIChyYykKICAgICAgICBnb3RvIHVwZGF0ZV9lbmQ7CgogICAgbWVtc2V0KGJ1ZiwgMCwgU0hBMV9IQVNIS0VZTEVOKTsKICAgIFNIQTFfRmluYWwoYnVmLCAmY3NoYTEpOwoKICAgIFNIQTFfSW5pdCgmY3NoYTEpOwogICAgcmMgPSAhU0hBMV9VcGRhdGUoJmNzaGExLCBLMiwgU0hBMV9IQVNIS0VZTEVOKTsKICAgIGlmIChyYykKICAgICAgICBnb3RvIHVwZGF0ZV9lbmQ7CiAgICByYyA9ICFTSEExX1VwZGF0ZSgmY3NoYTEsIGJ1ZiwgU0hBMV9TRUNSRVRLRVlMRU4pOwogICAgaWYgKHJjKQogICAgICAgIGdvdG8gdXBkYXRlX2VuZDsKCiAgICAvKgogICAgICogY29weSB0aGUgc2lnbiBjaGVja3N1bSB0byB0aGUgb3V0Z29pbmcgcG9pbnRlciAKICAgICAqLwogICAgU0hBMV9GaW5hbChidWYsICZjc2hhMSk7CiAgICBtZW1jcHkobWFjLCBidWYsIG1hY2xlbik7CgogIHVwZGF0ZV9lbmQ6CiAgICBtZW1zZXQoYnVmLCAwLCBTSEExX0hBU0hLRVlMRU4pOwogICAgbWVtc2V0KEsxLCAwLCBTSEExX0hBU0hLRVlMRU4pOwogICAgbWVtc2V0KEsyLCAwLCBTSEExX0hBU0hLRVlMRU4pOwogICAgbWVtc2V0KGV4dGVuZGVkQXV0aEtleSwgMCwgU0hBMV9IQVNIS0VZTEVOKTsKICAgIG1lbXNldCgmY3NoYTEsIDAsIHNpemVvZihjc2hhMSkpOwoKICAgIGlmIChuZXdkYXRhKQogICAgICAgIGZyZWUobmV3ZGF0YSk7CiAgICByZXR1cm4gcmM7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTyAqLwo=